廣播的妙用-android程序完全退出,銷燬所有activity方法

 轉載:http://blog.sina.com.cn/s/blog_6f6ea9d90101a8ad.html


這個問題一直困擾着我,試了n種方式,都不行,在網上搜了一圈,沒有能用的:

1.ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
manager.killBackgroundProcesses(package);
不行

2.android.os.Process.killProcess(android.os.Process.myPid());
也不行

3.manager.restartPackage(package);
還是不行


4.
Intent MyIntent = new Intent(Intent.ACTION_MAIN);
MyIntent.addCategory(Intent.CATEGORY_HOME);
startActivity(MyIntent);
finish();
這個只是退回到桌面,如果打開多個Activity關閉重新打開也會有問題,還是還是不行

看到有說廣播機制,發現是個好東東,能徹底解決這個問題,廢話不說看代碼:
Java代碼 
  1. public abstract class EnterActivity extends BaseActivity {
  2. ...
  3. // 寫一個廣播的內部類,當收到動作時,結束activity
  4. private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
  5. @Override
  6. public void onReceive(Context context, Intent intent) {
  7. unregisterReceiver(this); // 這句話必須要寫要不會報錯,不寫雖然能關閉,會報一堆錯
  8. ((Activity) context).finish();
  9. }
  10. };
  11. @Override
  12. public void onResume() {
  13. super.onResume();
  14. // 在當前的activity中註冊廣播
  15. IntentFilter filter = new IntentFilter();
  16. filter.addAction(Attribute.PAGENAME);
  17. registerReceiver(this.broadcastReceiver, filter); // 註冊
  18. }
  19. public void close() {
  20. Intent intent = new Intent();
  21. intent.setAction(Attribute.PAGENAME); // 說明動作
  22. sendBroadcast(intent);// 該函數用於發送廣播
  23. finish();
  24. }
  25. ...
  26. }


別人寫的缺了個地方(unregisterReceiver)這個必須要加,找了個最簡單的方法
用了這個方式,覺得很贊。但是自己的程序報了幾個錯誤。解決方法記錄如下:
首先,在你要退出程序的相應方法裏面調用
getApplicationContext().sendBroadcast(new Intent("finish"));
發送廣播。
1. Activity has leaked IntentReceiver  that was originally registered here. Are you missing a call to unregisterReceiver()?
註冊了廣播接收器後要在銷燬時取消註冊,否則會出錯。
@Override
protected void onDestroy() {
// 刪除廣播註冊
getApplicationContext().unregisterReceiver(mFinishReceiver);
super.onDestroy();
}
2.會報 receiver is not registered。或者空指針異常。
用getApplicationContext()註冊,用getApplicationContext()刪除。而不能直接unregisterReceiver(mFinishReceiver);和registerReceiver(mFinishReceiver, filter);有可能找不到。
@Override
public void onResume() {
super.onResume();
// 註冊廣播接收器
IntentFilter filter = new IntentFilter();
filter.addAction("finish");
getApplicationContext().registerReceiver(mFinishReceiver, filter);
}

 

發佈了40 篇原創文章 · 獲贊 4 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章