android 退出程序及back键相关处理

1、

Android的程序无需刻意的去退出,当你一按下手机的back键的时候,系统会默认调用程序栈中最上层Activity的Destroy()方法来销毁当前Activity,当此Activity又被其它Activity启动起来的时候,会重新调用OnCreate()方法进行创建,当栈中所有Activity都弹出结束后,应用也就随之结束了.如果说程序中存在service之类的,则可以在恰当的位置监听处理下也就可以了.

 

Android程序的隐藏,当你按下手机的Home键的时候,系统会默认调用程序栈中最上层Activity的stop()方法,然后整个应用程序都会被隐藏起来,当你再次点击手机桌面上应用程序图标时,系统会调用最上层Activity的OnResume()方法,此时不会重新打开程序,而是直接进入,会直接显示程序栈中最上层的Activity.

 

现在的情形是,一个应用程序带有启动画面或者启动动画,进入程序后进行操作,当应用程序退到主Activity的时候,再按back键或者程序中自己写的back按钮,此时程序会结束当前主Activity,当再次点击应用程序图标时,程序会重新打开,会从头显示启动画面,对于用户来说,就知道这个程序刚才已经被结束掉了,而用户的本意是显示桌面,为什么我退出的时候都没有提醒一下!例如带有启动画面的音乐播放软件,如果程序没有做任何处理,当主Activity退出时,播放音乐的服务还没有结束,当程序退出后音乐还在播放,当用户再次点击桌面上的音乐程序图标时,会再次执行启动画面,对用户来说,怎么程序还在运行的时候,又重新打开了一个新的,是不是我这样操作会启动两个音乐播放器啊!针对这样的情况,就需要在主Activity里按back时候时行监听,询问用户是退出还是隐藏,或者执行程序中设置的一个默认操作。如果是退出,我们就需要结束程序进程,Activity、Service等等,如果是隐藏,我们就需要实现手机上按Home时的效果,也就是隐藏后,当用户再次单击桌面上程序图标时,不会执行启动画面,而是直接进入程序栈中最上层退出时正在显示的Activity。

 

实现按Home键时隐藏程序的效果:

1:Android 2.0之前需要监听按键事件,进行判断是不是按下了back键

2:Android 2.0之后系统提供了一个onBackPressed()方法,这个方法就是专门用来监听back键事件的,所以只需重写onBackPressed()方法即可

3
4
5
6
7
8
9
10
11
     @Override
public  void  onBackPressed() {
     //实现Home键效果
     //super.onBackPressed();这句话一定要注掉,不然又去调用默认的back处理方式了
     Intent i= new  Intent(Intent.ACTION_MAIN);
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     i.addCategory(Intent.CATEGORY_HOME);
     startActivity(i);
}
3
  

退出应用程序的实现:可以自己写个方法,例如:

3
4
5
6
7
8
9
     public  void  exitProgrames(){
     Intent startMain = new  Intent(Intent.ACTION_MAIN);
             startMain.addCategory(Intent.CATEGORY_HOME);
             startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             startActivity(startMain);
             android.os.Process.killProcess(android.os.Process.myPid());
}

需要添加权限:<uses-permission android:name="android.permission.RESTART_PACKAGES" />

2、

Android如何退出程序

如果退出当前运行的Activity,可以使用 this.finish() 或者 System.exit(0) 。

 

如果退出整个程序,如下操作:

方式一:

Intent intent=new Intent(Intent.ACTION_MAIN);

intent.addCategory(Intent.CATEGORY_HOME);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

this.startActivity(intent);

System.exit(0);

 

方式二:

android.os.Process.killProcess(android.os.Process.myPid());

 

android 完全退出程序

有几个activity,有一需求是在一个activityA点击back键退出系统而不是跳到之前的activity

首先想到的是清空activityA的堆栈,使用intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 但是该activityA不是已经存在于堆栈底端的,所以清除的只是堆栈中该activityA上面的activity,但后退后还是会返回堆栈中该activityA下面的activity。

然后想到的是截获back按键的事件,使用System.exit(0)和android.os.Process.killProcess(android.os.Process.myPid())来退出程序,还是不行,当前的activityA是被干掉了,但是还是会被ActivityManager接管返回到前一个activity。而且如果之前activity需要一些传过来的参数的话会导致程序连续抛异常。

最后终于找到一个可行的方法:使用ActivityManager彻底退出程序

ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE); 
manager.restartPackage(getPackageName());

需要声明权限<uses-permission android:name="android.permission.RESTART_PACKAGES"/>

这种方法会终止一切和这个程序包关联的,所有共享同一uid的process被kill,所有的activity会被removed

所有创建的服务会停止,还会发一个广播 Intent.ACTION_PACKAGE_RESTARTED 导致所有注册alarms被stopped, notifications 被removed。

这几天刷了2.2的rom发现restartPackage方法无效,网上搜了下答案:

在Android 2.2中新增了一个API可以帮助我们杀死后台进程,不过Android123再次强调其调用的API Level最小为8,killBackgroundProcesses是android.app.ActivityManager类的方法,使用时必须在androidmanifest.xml文件中加入KILL_BACKGROUND_PROCESSES这个权限。虽然本类还提供了restartPackage (String packageName) 方法调用的API Level为3,但是SDK中已经标记为deprecated,其实他们的原理都是一样的,只不过过去Google的命名方式确实不是很合理,restartPackage的作用很难让我们联想到是结束进程。

该方法的原型 public void killBackgroundProcesses (String packageName) 仅有一个参数为package Name,使用方法比较简单。

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
am.killBackgroundProcesses("cn.com.android123.cwj"); 
// API Level至少为8才能使用
所以要用此方法最好加个判断如果是2.2之前的rom就用restartPackage之后的就用killBackgroundProcesses



转自:http://blog.163.com/yuck_deng/blog/static/19501514720118132409848/

http://www.cnblogs.com/wujd/archive/2011/11/17/2251991.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值