android studio版本:2021.2.1Patch 2
例程名称:ActivityJump
完成日期:2023.1.17
一直在完善一个小东西,也是不断的在学习。之前做的那个桌面日历天气(老旧安卓手机发挥余热做桌面时钟摆件使用),有一个问题,就是每次启动app都要重新选择显示模式和城市,虽然不麻烦,但没必要,所以我就想改一下,原理大概是这样:如果已经选择一次模式和城市了(app启动过一次),再次启动的时候就不要选择了,直接用上次的模式和城市显示就可以了。如果需要修改城市可以在显示界面进行修改。先解决第二次启动不用重新选择的问题。
例程实现:
程序启动的时候启动一个空的activity并判断文件是否存在。
如果不存在(第一次启动该文件不存在),则正常进入程序,并创建文件file.txt。
如果文件存在(第二次启动时该文件存在),则直接显示另一页面,并显示文件内容,文件内容每次都是覆盖前一次内容。
知识要点:1、文件存取、判断文件是否存在的操作;2、Activity之间跳转。
问题:我也不知道这是不是最好的方法,反正暂时只会这样。
具体过程:
建一个项目名称为:activityjump.(主要的activity)
新建一个关于文件读写的类filehelper.对文件读写操作。(本来可以不用这个,这个是学来的,懒的改)
activity_main.xml里面添加一个文件一个按钮:写入文件;一个textview:文件内容;一个edittext。布局如下图:
在edittext里面输入内容后,点击写入文件按钮,把文件写入file.txt,该文件存在于系统中,系统非root不可访问。
新建一个空activity:fileexist,用来显示file.txt内容。也是判断文件存在之后跳转的别一个页面。只有两个textview,一个显示文件存在的结果,另一个显示文件内容。如下图:
新建一个空activity:welcome,启动app时先启动这个activity,没有任何控件,就是判断文件是否存在,并实现activity之间跳转:
如果文件存在跳转到FileExist这个activity.
如果文件不存在跳转到MainActivity.
新建这个activity的时候下面这个框一定要选上,因为这个activity是后建的,不选上app启动的时候还是启动MainActivity。新建如下图:
全部代码:
Welcome.java 界面无内容,布局文件xml不用修改。
package com.example.activityjump;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import java.io.File;
public class Welcome extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
fileExist();
}
//对文件是否存在进行判断,然后跳转到不同的activity.
private void fileExist(){
File f=new File(getApplicationContext().getFilesDir(),"file.txt");
Intent intent = new Intent();
if(f.exists()) {
intent.setClass(Welcome.this,FileExist.class);//文件存在跳转的页面
startActivity(intent);//开始跳转
finish();//销毁本页面
System.out.println("文件存在。");
}else{
intent.setClass(Welcome.this,MainActivity.class);//文件不存在跳转的页面。
startActivity(intent);//开始跳转
finish();//销毁本页面
System.out.println("文件不不不不存在。");
}
}
说明:
File f=new File(getApplicationContext().getFilesDir(),"file.txt");不指定文件路径要这么写,不然app总找不到文件,为什么这么写还没研究。
activity之间跳转见:android studio radiobutton单选按钮实现界面跳转备忘(两种方法),其实关键就是下面几行代码:
Intent intent = new Intent();
intent.setClass(Welcome.this,FileExist.class);//文件存在跳转的页面
startActivity(intent);//开始跳转
finish();//销毁本页面
MainActivity.java
package com.example.activityjump;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button btnsave;
private Context mContext;
private TextView editdetail;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnsave=(Button)findViewById(R.id.btnsave);
editdetail=(TextView)findViewById(R.id.editdetail);
btnsave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FileHelper fHelper = new FileHelper(getApplicationContext());
String filedetail = editdetail.getText().toString();//获取editdetail控件输入内容
try {
fHelper.save("file.txt", filedetail);
Toast.makeText(getApplicationContext(), "数据写入成功", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "数据写入失败", Toast.LENGTH_SHORT).show();
}
}
});
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:text="@string/detailtitle"
android:textSize="20sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/editdetail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minLines="2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView3"
android:textSize="25sp"
tools:ignore="SpeakableTextPresentCheck,SpeakableTextPresentCheck" />
<Button
android:id="@+id/btnsave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btnwrite"
app:layout_constraintStart_toStartOf="parent"
android:textSize="20sp"
app:layout_constraintTop_toBottomOf="@+id/editdetail" />
</androidx.constraintlayout.widget.ConstraintLayout>
FileExist.java
package com.example.activityjump;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
public class FileExist extends AppCompatActivity {
private Context mContext;
private TextView showfile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file_exist);
showfile=(TextView)findViewById(R.id.textView2);
showFile();
}
//读取file.txt文件内容,textview显示文件内容。
private void showFile(){
String detail = "";
FileHelper fHelper2 = new FileHelper(getApplicationContext());
try {
detail = fHelper2.read("file.txt");
showfile.setText(detail);//textview显示文件内容
System.out.println("文件读取成功。");
} catch (IOException e) {
e.printStackTrace();
}
Toast.makeText(getApplicationContext(), detail, Toast.LENGTH_SHORT).show();
}
}
activity_file_exist.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FileExist">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="150dp"
android:text="文件存在"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="52dp"
android:text="TextView"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.501"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
FileHelper.java
package com.example.activityjump;
import android.content.Context;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileHelper {
private Context mContext;
public FileHelper() {
}
public FileHelper(Context mContext) {
super();
this.mContext = mContext;
}
/*
* 这里定义的是一个文件保存的方法,写入到文件中,所以是输出流
* */
public void save(String filename, String filecontent) throws Exception {
//这里我们使用私有模式,创建出来的文件只能被本应用访问,还会覆盖原文件哦
FileOutputStream output = mContext.openFileOutput(filename, Context.MODE_PRIVATE);
output.write(filecontent.getBytes()); //将String字符串以字节流的形式写入到输出流中
output.close(); //关闭输出流
}
/*
* 这里定义的是文件读取的方法
* */
public String read(String filename) throws IOException {
//打开文件输入流
FileInputStream input = mContext.openFileInput(filename);
byte[] temp = new byte[1024];
StringBuilder sb = new StringBuilder("");
int len = 0;
//读取文件内容:
while ((len = input.read(temp)) > 0) {
sb.append(new String(temp, 0, len));
}
//关闭输入流
input.close();
return sb.toString();
}
}
(FileHelper.java内容完全来自菜鸟教程)
关于文件读写的补充说明:
FileOutputStream output = mContext.openFileOutput(filename, Context.MODE_PRIVATE);
FileOutputStream有四种模式,见下图:
(上图来源于菜鸟教程)
其中:MODE_APPEND模式为不换行追加。
例程动画演示: