一、采用Intent.FLAG_ACTIVITY_CLEAR_TOP退出整个程序(多activity)
问题:
多activity中退出整个程序,例如按打开先后顺序从A->B->C->D(D在栈顶),这时我需要从D直接退出程序。网上资料:{
finish()和system(0)都只能退出单个activity。杀进程等的等方式都不行~~~
解决问题:
我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在D窗口打开A窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,再次开启A时将会清除该进程空间的所有Activity。
在D中使用下面的代码:
- Intent intent = new Intent();
- intent.setClass(D.this, A.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG设置
- startActivity(intent); //注意,startActivity是异步执行,换句话说,startActivity是立即返回的,是不会阻塞的,因此下面的finish得意执行
- finish();//关掉自己
在A中加入代码:
- //Override
- protected void onNewIntent(Intent intent) {
- // TODO Auto-generated method stub
- super.onNewIntent(intent);
- //退出
- if ((Intent.FLAG_ACTIVITY_CLEAR_TOP & intent.getFlags()) != 0) {
- finish();
- }
- }
A的Manifest.xml配置成android:launchMode="singleTop"
原理总结:
一般A是程序的入口点,从D起一个A的activity,加入标识Intent.FLAG_ACTIVITY_CLEAR_TOP这个过程中会把栈中B,C,都清理掉。因为A是android:launchMode="singleTop" ,因此 不会调用oncreate(),而是响应onNewIntent(),这时候判断Intent.FLAG_ACTIVITY_CLEAR_TOP,然后把A finish()掉。
栈中A,B,C,D全部被清理。所以整个程序退出了。
诗帆个人补充,如何实现立即退出效果:
1.可以把A设置成不可见的Acitivity(方法见下面),然后在它的onCreate方法里跳转到“真正”的载入界面(另一个有界面的Activity)
就可以实现在D中点退出程序按钮时看上去立即退出程序的效果
2.A必须是程序启动的第一个Activity才能起到这种立即退出的效果,因为Intent.FLAG_ACTIVITY_CLEAR_TOP只会把目标Activity的“上面”的Activity清理掉,而如果目标Activity的“下面”还有Activity(换句话说,目标Activity不在栈底),则finish后只会到他下面的那个Activity,而不是立即退出的效果了
3.不可见Activity
在项目的AndroidManifest.xml文件中相应的Activity标签中添加这样一行:
android:theme=”@android:style/Theme.NoDisplay”
这样一来,当这个Activity启动的时候,就不会显示出界面了
————————————————————————————————————————————————————
二、Android2.2用广播机制退出整个程序
这个问题一直困扰着我,试了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关闭重新打开也会有问题,还是还是不行
看到有说广播机制,发现是个好东东,能彻底解决这个问题,废话不说看代码:
- public abstract class EnterActivity extends BaseActivity {
- ...
- // 写一个广播的内部类,当收到动作时,结束activity
- private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- close();
- unregisterReceiver(this); // 这句话必须要写要不会报错,不写虽然能关闭,会报一堆错
- }
- };
- @Override
- public void onResume() {
- super.onResume();
- // 在当前的activity中注册广播
- IntentFilter filter = new IntentFilter();
- filter.addAction(Attribute.PAGENAME);
- registerReceiver(this.broadcastReceiver, filter); // 注册
- }
- /**
- * 关闭
- */
- public void close() {
- Intent intent = new Intent();
- intent.setAction(Attribute.PAGENAME); // 说明动作
- sendBroadcast(intent);// 该函数用于发送广播
- finish();
- }
- ...
- }