onSaveInstanceState()方法的使用
onSaveInstanceState()回调方法,这个方法可以保证在活动被回收之前一定会被调用,因此我们可以通过这个方法来解决活动被回收时临时数据得不到保存的问题。
onSaveInstanceState()方法会携带一个额Bundle类型的参数,Bundle提供了一系列的方法用于保存数据,比如可以使用putString()方法保存字符串,使用putInt()方法保存整型数据,以此类推。保证每个方法需要传入两个参数,第一个参数是键,用于后面从Bundle中取值,第二个参数是真正要保存的内容。
在MainActivity中添加如下代码就可以将临时数据进行保存:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key", tempData);
}
数据在onCreate中恢复,onCreate有一个Bundle,没有调用onSaveInstanceState的时候默认是null,恢复数据代码如下:
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
setContentView(R.layout.activity_main);
if (savedInstanceState != null){
String tempData = savedInstanceState.getString("data_key");
Log.d(TAG, tempData);
}
}
这里的Bundle传递数据类似前面的Intent传递数据方法,实际上之前Intent传递数据是可以结合Bundle来实现的,代码如下:
Bundle bundle = new Bundle();
bundle.putString("data_key","hello world");
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtras(bundle);
startActivity(intent);
SecondActivity接收数据代码如下:
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String resultStr = bundle.getString();
Log.d(TAG, resultStr);
活动的启动模式
活动的启动模式分为4种,分别是standard、singleTop、singleTask和singleInstance,可以在AndroidMainifest.xml中通过给标签指定android:launchMode属性来选择启动模式。
standara
standard是活动默认的启动模式,在不进行显式指定的情况下,所有活动都会自动使用这种启动模式。
singleTop
singleTop模式下,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。使用如下:
<activity
android:name=".FirstActivity"
android:launchMode="singleTop"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<intent-filter>
</activity>
singleTask
当活动的启动模式指定为singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动智商的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。代码示例如下:
<activity
android:name=".FirstActivity"
android:launchMode="singleTask"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<intent-filter>
</activity>
singleInstance
不同于以上3仲启动模式,指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动(其实如果singleTask模式指定了不同的taskAffinity,野会启动一个新的返回栈)。
<activity
android:name=".FirstActivity"
android:launchMode="singleInstance"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<intent-filter>
</activity>
随时随地退出程序
1.新建一个ActivityCollector类作为活动管理器,代码如下所示:
public class ActivityCollector{
public static List<Activity> activities = new ArrayList<>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
public static void finishAll() {
for (Activity activity : activities){
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}
2.修改BaseActibity中的代码,如下所示:
public class BaseActivity extends AppCompatActivity {
@Overrid
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.d("BaseActivity",getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
3.从此以后,不管你想在什么地方退出程序,只需要调用ActivityCollector.finishAll()方法就可以了。示例代码如下:
public class ThirdActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.third_layout);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener()) {
@Override
public void onClick(View v) {
ActivityCollector.finishAll();
}
}
}
}