關於Activity一些技巧
標籤(空格分隔): Activity
1.活動被回收了怎麼辦?
活動中可以存在一些臨時數據和狀態,如果被回收了,可能之前的臨時數據全沒了。
Activity中提供了一個onSaveInstanceState()回調方法,這個方法保證一定會在活動被回收之前調用,因此,我們可以通過這個方法來解決活動回收時臨時數據得不到保存的問題。
onSaveInstanceState()會攜帶一個Bundle類型的參數,Bundle提供了一系列的方法用於保存數據,比如putString()、putInt()等。
在MainActivity中添加如下代碼就可以將臨時數據進行保存:
@Override
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
String tempData="Something need to be stored";
outState.putString("data_key",tempData);
}
我們需要取出臨時保存的全部數據,只需要在onCreate()中相應的方法取出數據即可。
修改MainActivity的onCreate()方法,如下所示:
@Overrid
protected void onCreate(Bundle savedInstanceState){
.....
.....
if(savedInstanceState!=null){
String tempData=savedInstanceState.getString("data_key");
Log.i("MainActivity",tempData);
}
}
2. 知曉當前是哪一個活動
新建一個BaseActivity繼承自Activity,然後重寫onCreate()方法如下所示:
public void BaseActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.i("BaseActivity",getClass().getSimpleName());
}
}
3. 隨時隨地的退出程序
如果你想退出程序,有時候需要按多次Back鍵纔行,按Home鍵只是把程序掛起,並沒有退出。如果需要隨時隨地的退出程序應該怎麼辦呢,其實這個思路很簡單,我們只需要用一個專門的集合類來對所有的活動進行管理就可以了。
新建一個ActivityCollector類作爲活動管理器,代碼如下:
/**
*活動管理器
*/
public class ActivityCollector {
public static List<Activity> activities=new ArrayList<Activity>();
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.fininsh();
}
}
}
}
接下來修改BaseActivity中的代碼,如下所示:
public void BaseActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.i("BaseActivity",getClass().getSimpleName());
//將正在創建的活動添加到活動管理器中
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy(){
super.onDestroy();
//將一個將要銷燬的活動從活動管理器中移除
ActivityCollector.removeActivity(this);
}
}
如果需要在哪個地方退出程序,只需要調用ActivityCollector.finishAll()方法就可以了。
4. 啓動活動的最佳寫法
修改SecondActivity中代碼,如下所示:
public class SecondActivity extends BaseActivity{
public static void actionStart(Context context,String data1,String data2){
Intent intent=new Intent(context,SecondActivity.class);
intent.putExtra("param1",data1);
intent.putExtra("param2",data2);
context.startActivity(intent);
}
}
這樣簡化了啓動代碼,只需要一行代碼就可以啓動SecondActivity,如下所示:
SecondActivity.actionStart(FirstActivity.this,"data1","data2");
養成良好的習慣,給每個活動都添加類似的啓動方法。