`
iaiai
  • 浏览: 2204316 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 2.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) {
			unregisterReceiver(this); // 这句话必须要写要不会报错,不写虽然能关闭,会报一堆错
			((Activity) context).finish();
		}
	};

	@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)这个必须要加,找了个最简单的方法
分享到:
评论
13 楼 meteor0626 2012-01-14  
确实可以完全退出,但是在点击返回按键的时候会出错。

01-14 01:18:14.612: ERROR/ActivityThread(283): Activity com.cnki.homeActivity has leaked IntentReceiver com.cnki.homeActivity$3@43e74868 that was originally registered here. Are you missing a call to unregisterReceiver()?
01-14 01:18:14.612: ERROR/ActivityThread(283): android.app.IntentReceiverLeaked: Activity com.cnki.homeActivity has leaked IntentReceiver com.cnki.homeActivity$3@43e74868 that was originally registered here. Are you missing a call to unregisterReceiver()?
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.app.ActivityThread$PackageInfo$ReceiverDispatcher.<init>(ActivityThread.java:939)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.app.ActivityThread$PackageInfo.getReceiverDispatcher(ActivityThread.java:734)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:791)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.app.ContextImpl.registerReceiver(ContextImpl.java:778)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.app.ContextImpl.registerReceiver(ContextImpl.java:772)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at com.cnki.homeActivity.onResume(homeActivity.java:596)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.app.Activity.performResume(Activity.java:3823)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3118)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.os.Looper.loop(Looper.java:123)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at android.app.ActivityThread.main(ActivityThread.java:4627)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at java.lang.reflect.Method.invokeNative(Native Method)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at java.lang.reflect.Method.invoke(Method.java:521)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-14 01:18:14.612: ERROR/ActivityThread(283):     at dalvik.system.NativeStart.main(Native Method)

12 楼 zht19880706 2011-10-30  
我的那个完全退出不了,退出之后,就自动跳转成出异常的那个界面
11 楼 飞扬云 2011-09-26  
用了此方法,感觉还是可以的。不过我把finish方法换成了杀死进程的方法:
android.os.Process.killProcess(android.os.Process.myPid());
10 楼 iaiai 2011-08-26  
eimsteim 写道
而且,为何要在广播中去杀掉进程呢?当前进程在未处于onStop状态时,及时调用广播来处理,也不能杀不掉吧?


如果不用广播我想知道你怎么样关闭打开的所有Activity,我说的关闭不了的情况是在android 2.2系统中发现关不掉的,如果像网上其它人说的用System.exit是关不掉的,并且调用此方法会出现其它一系列的问题,比如如果后台开着线程你调用System.exit会直接把你线程杀掉,这问题我写的代码的时候遇到了,找了好久才找到是System.exit给杀掉了,所以如果想关闭所有打开的activity必须得知道你打开所有的activity,用广播的方法其实感觉比较简单一些,只要发条通知关闭操作就可以了。当然你也可以用一个变量把所有打开的activity存储下来,我没用这种方式感觉太......
在android里没有彻底关闭软件的方法,网上现在讨论有两类,一类是熟悉windows操作习惯点击关闭就彻底关闭系统,但另一类人主张的不用彻底关闭,因为下次再打开的时候速度会快,并且如果内存不够的时候android会自动管理内存,关闭一些,总之不提供关闭方法确实是很麻烦的一件事情
9 楼 iaiai 2011-08-26  
eimsteim 写道
你好,根据你的建议,我重新温习了一下广播的相关知识,重新看你的代码,发现有些地方不太能够理解了:
sendBroadcast(intent);// 该函数用于发送广播
这行为什么要放在close()里呢?

如果我的“退出”按钮OnClickListener中调用close()进行关闭操作的话,不就给BroadcastReceiver 发送了一个广播吗?然后在广播的onReceive()回调中,又会调用close(),这不就形成了一个闭环递归吗?


呵呵呵,你真是纠结,我写的确实有问题,现在改过来了,你自己能看懂就可以了,其实你想的并没有错,确实如果在广播体内放close()是套在循环里了.
8 楼 eimsteim 2011-08-26  
而且,为何要在广播中去杀掉进程呢?当前进程在未处于onStop状态时,及时调用广播来处理,也不能杀不掉吧?
7 楼 eimsteim 2011-08-26  
你好,根据你的建议,我重新温习了一下广播的相关知识,重新看你的代码,发现有些地方不太能够理解了:
sendBroadcast(intent);// 该函数用于发送广播
这行为什么要放在close()里呢?

如果我的“退出”按钮OnClickListener中调用close()进行关闭操作的话,不就给BroadcastReceiver 发送了一个广播吗?然后在广播的onReceive()回调中,又会调用close(),这不就形成了一个闭环递归吗?
6 楼 iaiai 2011-08-25  
eimsteim 写道
按照你推荐的方法,我在Activity02中设置了一个退出按钮,onclick事件中调用close()方法,使用finish()时会报receiver not registered,而如果使用System.exit(0)替代,则只能退出当前的Activity02,而不能退出整个应用,不知道LZ有没有自己试过这个方法?是否可行呢?


你说的方法我当然试过,不用说肯定试过了,网上说的很多方法都试过,所有说的在2.2系统下都不行,System.exit(0)我不太建议用这种关闭方式,因为这种方式会有个问题,就是如果你启动服务,或是开了一些其它线程,你用这种方式会把那些线程都关闭掉,但是我只是想关闭的是所有activity,在后台运行的线程我并不想关闭,所以只能用finish这个方法去把activity关闭掉。

你报的那个错你看一下是不是调用过
registerReceiver(this.br, filter);  //注册
这句注册的话,还有就是你是不是调用了两编close()这个方法,总之我给你的是一种广播的思路,你只要会用广播这种试的话你就应该知道怎么样去关闭所有activity了
5 楼 eimsteim 2011-08-25  
附上我的Activity02的代码:
	//写一个广播的内部类,当收到动作时,结束activity
	private BroadcastReceiver br = new BroadcastReceiver() {
		
		@Override
		public void onReceive(Context context, Intent intent) {
			close();
			unregisterReceiver(this);
		}
	};
	@Override
	protected void onResume() {
		super.onResume();
		
		//在当前Activity中注册广播
		IntentFilter filter = new IntentFilter();
		filter.addAction(Intent.ACTION_MAIN);
		registerReceiver(this.br, filter);	//注册
		
		System.out.println("Activity02---------------------------->onResume");
	}
	/**
	 * 关闭
	 */
	public void close(){
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_MAIN);
		sendBroadcast(intent);	//该函数用于发送广播
//		finish();
		System.exit(0);
	}
4 楼 eimsteim 2011-08-25  
按照你推荐的方法,我在Activity02中设置了一个退出按钮,onclick事件中调用close()方法,使用finish()时会报receiver not registered,而如果使用System.exit(0)替代,则只能退出当前的Activity02,而不能退出整个应用,不知道LZ有没有自己试过这个方法?是否可行呢?
3 楼 eimsteim 2011-08-25  
请问 Attribute.PAGENAME 这是从哪里来的?

另外怎样触发那个广播呢?
2 楼 iaiai 2011-08-11  
在android 2.2上你打开多个activity的时候,这时候你想退出的话你是关不掉所有打开的activity的,必须要通过我上面的这种方式关闭
1 楼 thihy 2011-08-10  
完全退出程序是啥意思?

相关推荐

    Android2.2通讯录源码

    首先,我们要明白Android 2.2的通讯录系统是由多个组件组成的,包括数据库管理、UI界面、服务以及广播接收器等。主要涉及以下几个关键知识点: 1. **Content Provider**:通讯录数据存储的核心组件,它提供了一个...

    android2.2 录音程序完整源码

    针对"android2.2 录音程序完整源码"这个主题,我们将深入探讨Android 2.2(Froyo)版本下的录音API,以及如何实现一个简单的录音应用。这段源码为初学者提供了实践和理解Android录音机制的良好机会。 Android录音...

    android-2.2源码

    3. **应用程序存储**:Android 2.2允许应用程序选择将数据存储在内部存储或外部SD卡上,提高了应用程序的可移植性和用户数据管理的灵活性。 4. **应用程序管理**:引入了动态安装和卸载功能,用户可以更方便地管理...

    Android2.2 ApiDemos

    Android 2.2的ApiDemos为开发者提供了一个全面了解和学习Android API的平台,通过它,我们可以深入理解Android系统的运作机制,提升开发技能。无论是初学者还是经验丰富的开发者,都应该充分利用这个资源,不断探索...

    android2.2 adb工具

    在“android2.2 adb工具”这个主题下,我们主要关注的是适用于Android 2.2(Froyo)版本的ADB工具及其相关功能。 ### ADB简介 ADB全称为Android Debug Bridge,它是Google提供的一个开发工具套件的一部分,主要用于...

    Android 2.2 API 中文文档

    14. **WebKit 533.1**:Android 2.2使用了更新的WebKit渲染引擎,提供更快的网页加载速度和更好的HTML5支持。 综上所述,Android 2.2 API的更新不仅提升了系统的性能,还提供了更多创新的开发者工具和功能,为应用...

    Android2.2 widget小程序

    《Android2.2小部件(Widget)开发详解》 Android平台的小部件(Widget)是其桌面环境中的一个重要组成部分,允许用户在主屏幕上放置各种应用程序的功能快捷方式或动态展示信息。本教程将深入探讨如何在Android 2.2...

    Android 2.2下能用的SwitchButton

    标题提到的"Android 2.2下能用的SwitchButton"是指在Android 2.2(API级别8)这个较旧的版本上,开发者通常无法直接使用原生的Switch控件,因为Switch是在Android 4.0(API级别14)及以上版本引入的。描述中提到的...

    lockscreen for android 2.2

    总的来说,“lockscreen for android 2.2”是Android生态系统中的一个创新实践,它结合了Android 2.2的特性和用户需求,通过定制化的锁屏界面,为用户提供更便捷、个性化的手机使用体验。这背后涉及的不仅是软件开发...

    android2.2源码下载

    在Android操作系统的发展历程中,Android 2.2(Froyo)是一个重要的里程碑,它带来了许多性能提升和新功能。本文将深入探讨Android 2.2源码的相关知识点,包括其下载、解压、编译以及如何利用这些源码进行学习和开发...

    Android 2.2 API中文文档合集

    这份文档集合包含了Android 2.2(API级别8)及部分2.3(API级别9)的详细中文翻译,旨在帮助开发者理解和使用Android平台的各种功能和接口。 首先,Android API文档是开发者进行程序设计的重要参考资料,它详细地...

    android2.2 拍照程序完整源码

    针对"android2.2 拍照程序完整源码"这个主题,我们可以深入探讨Android 2.2版本中实现拍照功能的相关知识点。 首先,Android 2.2(Froyo)是Android操作系统的一个重要版本,发布于2010年,它引入了一些性能优化...

    Android 2.2 源码

    4. **应用程序框架**:Android 2.2源码中包含了丰富的应用程序框架API,如ContentProvider、Intent、BroadcastReceiver等,开发者可以利用这些组件构建复杂的交互式应用。 5. **多任务处理**:2.2版本强化了多任务...

    android 2.2 源码

    解压Android 2.2源码到Android SDK的platforms/android-8文件夹内,是为了在Eclipse等开发环境中使用源码浏览功能。这样,开发者可以在编写代码时直接查看系统类的源码,有助于理解和解决问题。重启Eclipse后,源码...

    Android 2.2 API 中文版

    《Android 2.2 API 中文版》是一个针对Android开发者的重要资源,它提供了全面的、中文解释的Android 2.2版本的应用程序接口(API)文档。这份文档对于那些使用这个平台进行移动应用开发的专业人士来说,无疑是一份...

    android 2.2 source api 8

    在这个压缩包中,包含的是Android 2.2的源代码,这对于开发者来说是一个宝贵的资源,可以深入理解系统的内部工作原理,进行自定义修改,或者对Android应用程序进行更底层的优化。 一、Android 2.2的特性与改进 1. *...

    android 2.2 源码下载 学习必备

    Android 2.2(Froyo)源码学习是Android开发者深入理解系统工作原理和优化应用性能的关键步骤。源码提供了对操作系统内核、库、框架以及用户界面等所有层次的详细视图,使得开发者能够从底层到高层全面了解Android...

    Android 2.2 开发环境配置详解(最新出炉)

    至此,您已经成功配置了Android 2.2的开发环境,可以开始使用Eclipse进行应用程序的开发了。请确保保持SDK Manager的更新,以便获得最新的API和其他开发者工具,以保持开发环境的先进性和兼容性。 在开发过程中,...

    android2.2中文排序data包

    总的来说,"android2.2中文排序data包"是Android 2.2系统为了支持中文字符正确排序而使用的ICU库的数据文件。这些数据使得系统能够按照中文的语法规则和习惯进行文本排序,提供更好的用户体验。随着Android系统的...

    android2.2sdk2共2个

    android2.2sdk1共2个 android2.2sdk1共2个android2.2sdk1共2个

Global site tag (gtag.js) - Google Analytics