论坛首页 移动开发技术论坛

Android 2.2完全退出程序, 使用广播机制

浏览 23295 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-07-15   最后修改:2011-07-16
这个问题一直困扰着我,试了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();
	}
...
}


别人写的缺了个地方(unregisterReceiver)这个必须要加,找了个最简单的方法
   发表时间:2011-07-15  
Very good !!
0 请登录后投票
   发表时间:2011-07-18  
赞一个!!我昨天也遇到不能退出的问题!
0 请登录后投票
   发表时间:2011-07-18  
嗯,又是Android完全退出程序。在GoogleGroup常常看到这种问题。有点儿不明白,楼主在什么情况下需要“完全退出程序”呢?

按照Android的设计理念,一个Application可以类比成一个网站,一个Activity就像一个网页。系统在需要资源的时候才会摧毁一个Application。对于用户而言,他们点Back键的时候不会有“彻底退出这个程序”的概念,就像你在浏览器上看完这个论坛关浏览器也不会想“彻底摧毁这个网页”一样。

你如果放眼看现在的一些WebOS,以及Apple的iOS等其他的系统,都有类似的设计观念:用户不需要在乎程序是不是退出了,一段时间一个程序处于“不活跃”的状态它就会被系统退出。

任何时候你都可以通过一些奇特的步骤退出一个Android程序。但是我个人觉得这种办法有两个坏处:一是你的“退出程序”的代码在Android疯狂升级的过程中是否一直有效?毕竟你的行为是与它的模型相悖的。二是如果你的程序还有做iphone版本,web版本的想法,你现在的model是否可用?

总之,我一直觉得一个设计正确的android程序是不需要一段“彻底退出程序”的代码的。
0 请登录后投票
   发表时间:2011-07-18  
试试forceStopPackage看看可以用吗?
0 请登录后投票
   发表时间:2011-07-18  
lenciel 写道
嗯,又是Android完全退出程序。在GoogleGroup常常看到这种问题。有点儿不明白,楼主在什么情况下需要“完全退出程序”呢?

按照Android的设计理念,一个Application可以类比成一个网站,一个Activity就像一个网页。系统在需要资源的时候才会摧毁一个Application。对于用户而言,他们点Back键的时候不会有“彻底退出这个程序”的概念,就像你在浏览器上看完这个论坛关浏览器也不会想“彻底摧毁这个网页”一样。

你如果放眼看现在的一些WebOS,以及Apple的iOS等其他的系统,都有类似的设计观念:用户不需要在乎程序是不是退出了,一段时间一个程序处于“不活跃”的状态它就会被系统退出。

任何时候你都可以通过一些奇特的步骤退出一个Android程序。但是我个人觉得这种办法有两个坏处:一是你的“退出程序”的代码在Android疯狂升级的过程中是否一直有效?毕竟你的行为是与它的模型相悖的。二是如果你的程序还有做iphone版本,web版本的想法,你现在的model是否可用?

总之,我一直觉得一个设计正确的android程序是不需要一段“彻底退出程序”的代码的。


呵呵,其实网站形式是没有退出,只要返回就可以了,但是你别忘了网站是有session的,android是无状态的,多个activity之间你无法知道是否是登录过的,因为我做的是android上的oa系统,必须是要有状态的,我不希望我打开一次系统之后就一直在那里退不出去,如果你是做j2ee的话你应该清楚这种带来的后果,虽然用cookie可以保存数据用于下次打开登录,但是网页也并不是不能完全关闭,多个网页是嵌入在浏览器里,浏览器一旦关闭你随之应用也就关掉了,这跟android上做东西没什么区别,只是你做的android程序最主要的是用不用登录,用不用保持像网站一样的session这种状态,如果不用那根本不用做退出,但如果要保持状态我想所有人都会要求做退出,你可以用像cookie这种方式保存状态,但退出一定要做,还有一个给你拿android上的QQ举例,如果android上的QQ不做退出,那我岂不是一直打开那个号,连关都关不掉,你感觉这样合适吗?
0 请登录后投票
   发表时间:2011-07-18  
我比较关注的是 这个方法在其它版本上能通用吗?
0 请登录后投票
   发表时间:2011-07-18  
我的建议,将记录下来的状态清空或者置于初始状态,然后finish~
其他的别管了
0 请登录后投票
   发表时间:2011-07-18  
VeryGood
0 请登录后投票
   发表时间:2011-07-19   最后修改:2011-07-19
iaiai 写道
呵呵,其实网站形式是没有退出,只要返回就可以了,但是你别忘了网站是有session的,android是无状态的,多个activity之间你无法知道是否是登录过的,因为我做的是android上的oa系统,必须是要有状态的,我不希望我打开一次系统之后就一直在那里退不出去,如果你是做j2ee的话你应该清楚这种带来的后果,虽然用cookie可以保存数据用于下次打开登录,但是网页也并不是不能完全关闭,多个网页是嵌入在浏览器里,浏览器一旦关闭你随之应用也就关掉了,这跟android上做东西没什么区别,只是你做的android程序最主要的是用不用登录,用不用保持像网站一样的session这种状态,如果不用那根本不用做退出,但如果要保持状态我想所有人都会要求做退出,你可以用像cookie这种方式保存状态,但退出一定要做,还有一个给你拿android上的QQ举例,如果android上的QQ不做退出,那我岂不是一直打开那个号,连关都关不掉,你感觉这样合适吗?


你扯上的这些“session”,“cookie”,“下线”跟完全退出程序没有任何关系。安全级别比OA系统高得多的android程序一大把,没有哪个会去做“完全退出程序”的动作。拿你说的qq举例,它是起了单独的service,service提供所有的功能接口。一些bind到这个service的activity提供用户使用的UI。当用户选择“退出”的时候,只不过是停止这个service,然后finish当前界面而已。Linux的进程还是cache在那里的。

如果你还想争论,建议你先看看这些:

http://stackoverflow.com/questions/3241322/android-howto-kill-my-own-activity-the-hard-way
http://stackoverflow.com/questions/2033914/quitting-an-application-is-that-frowned-upon
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics