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

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

浏览 23387 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-07-19  
有点明白你的意思了,不过如果我做oa的话虽然关掉了,但是如果还cache在那里再打开的话对于用户来说就不太好了,没有登录过的话不应该再看到登录过以后的东西。

不知道你们设计的时候一般怎么设计退出,如果应用包含登录的话,这种方式合理吗?再打开没登录还显示上次用户登录过以后的界面......我做的是oa信息不是公开的那种
0 请登录后投票
   发表时间:2011-07-19  
Activity 的 onCreate里处理呀,每次都会调用,打开一个对话框,登陆啊。

我也使用过android.os.Process.killProcess(android.os.Process.myPid());这种方式,如果系统有后台线程,就必须设法关掉,仅仅是关掉Activity是没用的,为了省事直接用这个,后台线程肯定会杀掉。
0 请登录后投票
   发表时间:2011-07-19  
pgmsoul 写道
Activity 的 onCreate里处理呀,每次都会调用,打开一个对话框,登陆啊。

我也使用过android.os.Process.killProcess(android.os.Process.myPid());这种方式,如果系统有后台线程,就必须设法关掉,仅仅是关掉Activity是没用的,为了省事直接用这个,后台线程肯定会杀掉。



多个activity用这种方式在2.2版本上不可用的,关不掉所有的....你试试就知道了
0 请登录后投票
   发表时间:2011-07-26  
Cindy_Lee 写道
我比较关注的是 这个方法在其它版本上能通用吗?

0 请登录后投票
   发表时间:2011-10-09  
lenciel 写道
嗯,又是Android完全退出程序。在GoogleGroup常常看到这种问题。有点儿不明白,楼主在什么情况下需要“完全退出程序”呢?

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

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

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

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



对“完全退出程序”有了新的认识,学习中。
0 请登录后投票
   发表时间:2011-11-04  
iaiai 写道
这个问题一直困扰着我,试了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)这个必须要加,找了个最简单的方法



如果要调用怎么调用呢?
直接调用 this.close();

如果打开很多个Activity, 直接在单独一个Activity调用this.close()
我发现会有循环的调用.
不信你试试 ,会有多个一个Activity会有多次onReceive被执行
0 请登录后投票
   发表时间:2012-01-14  
感觉BroadcastReceiver 做了太多的事了
0 请登录后投票
   发表时间:2012-01-16  
什么叫  再打开没登录还显示上次用户登录过以后的界面. 我很好奇你的登录是怎么做的.

iaiai 写道
有点明白你的意思了,不过如果我做oa的话虽然关掉了,但是如果还cache在那里再打开的话对于用户来说就不太好了,没有登录过的话不应该再看到登录过以后的东西。

不知道你们设计的时候一般怎么设计退出,如果应用包含登录的话,这种方式合理吗?再打开没登录还显示上次用户登录过以后的界面......我做的是oa信息不是公开的那种

0 请登录后投票
   发表时间:2012-01-16  
clarkamx 写道
什么叫  再打开没登录还显示上次用户登录过以后的界面. 我很好奇你的登录是怎么做的.

iaiai 写道
有点明白你的意思了,不过如果我做oa的话虽然关掉了,但是如果还cache在那里再打开的话对于用户来说就不太好了,没有登录过的话不应该再看到登录过以后的东西。

不知道你们设计的时候一般怎么设计退出,如果应用包含登录的话,这种方式合理吗?再打开没登录还显示上次用户登录过以后的界面......我做的是oa信息不是公开的那种



什么叫登录怎么做的,你看不懂什么意思吗?
我在网上看到现在分两派,一派像windows操作系统一样,关闭就算真正关闭,还有一派就像iphone设计的一样,退出的时候实现是最小化当前的应用到内存里了,下次打开的时候还会直接打开上次关闭时的位置.....
我是不想要后者.....你看不明白吗?
0 请登录后投票
   发表时间:2012-01-17  
你将栈中的所有Activity都finish掉的话, 下次打开程序怎么可能是上次的界面.

iaiai 写道
clarkamx 写道
什么叫  再打开没登录还显示上次用户登录过以后的界面. 我很好奇你的登录是怎么做的.

iaiai 写道
有点明白你的意思了,不过如果我做oa的话虽然关掉了,但是如果还cache在那里再打开的话对于用户来说就不太好了,没有登录过的话不应该再看到登录过以后的东西。

不知道你们设计的时候一般怎么设计退出,如果应用包含登录的话,这种方式合理吗?再打开没登录还显示上次用户登录过以后的界面......我做的是oa信息不是公开的那种



什么叫登录怎么做的,你看不懂什么意思吗?
我在网上看到现在分两派,一派像windows操作系统一样,关闭就算真正关闭,还有一派就像iphone设计的一样,退出的时候实现是最小化当前的应用到内存里了,下次打开的时候还会直接打开上次关闭时的位置.....
我是不想要后者.....你看不明白吗?

0 请登录后投票
论坛首页 移动开发技术版

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