//完全退出
//((ActivityManager)getSystemService(Context.ACTIVITY_SERVICE)).restartPackage(getPackageName());
//finish();
//android.os.Process.killProcess(android.os.Process.myPid());
//System.exit(0);
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
am.killBackgroundProcesses(getPackageName()); finish和杀进程都只是把当前activity干掉。如果我从A->B->C->D,这时我需要从D直接退出程序。网上查询相关资料
2.1之前版本采用第一个方法需要加入权限<uses-permission android:name="android.permission.RESTART_PACKAGES"/>
这几天刷了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的作用很难让我们联想到是结束进程。最后一个方法需要加入权限<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES">但是现在的问题是按照这种方法还是退不出!!!请教谁做过的,帮忙解决下。万分感激
//((ActivityManager)getSystemService(Context.ACTIVITY_SERVICE)).restartPackage(getPackageName());
//finish();
//android.os.Process.killProcess(android.os.Process.myPid());
//System.exit(0);
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
am.killBackgroundProcesses(getPackageName()); finish和杀进程都只是把当前activity干掉。如果我从A->B->C->D,这时我需要从D直接退出程序。网上查询相关资料
2.1之前版本采用第一个方法需要加入权限<uses-permission android:name="android.permission.RESTART_PACKAGES"/>
这几天刷了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的作用很难让我们联想到是结束进程。最后一个方法需要加入权限<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES">但是现在的问题是按照这种方法还是退不出!!!请教谁做过的,帮忙解决下。万分感激
解决方案 »
- 不规则的拼图游戏
- 求助:Android的gprs上网
- 关于数据文件路径问题
- HTC G14 官方升级4.0.3后,进行官方解锁
- Android中怎样由图片的id号R.drawable.XX得到图片文件XX的绝对路径
- 求在Android里退出整个程序的方法(程序里包含多个Activity)
- 大家手机连接电脑用什么工具
- android fragment界面的添加
- 在android编程的学习中,遇到一点关于Socket编程上的问题
- Android程序 不同分辨率机型 美工如何作图
- android opengl es c代码 所有函数返回都正常,但看不到结果,分析原因
- 优酷安卓客户端里面的集数是如何显示的?
Process.killProcess(id);
这个方法还仅仅是把当前的activity进程杀掉,现在如果我A->B->C,现在我想从C直接退出应用程序,在C中用int id = Process.myPid();
Process.killProcess(id);仅仅是把C的进程杀了,程序不能完全退出
A->B
B中执行android.os.Process.killProcess(android.os.Process.myPid());
结果是结束了B,然后黑屏一秒,然后重新启动A。
B中执行android.os.Process.killProcess(getTaskId());
结果是结束了B,未经黑屏,没有android的过渡效果,直接回到A的原状态,A没有重新启动。
B中执行finish(RESULT_OK);
结果是结束了B,经过android过渡效果回到A的原状态,A没有重新启动。这些现象和这几个函数的功能说明不一致啊,现在怀疑android的SDK到底完善没有
这是我们常做的,也是比较好的做法。
在某一个activity根据需要在用startActivity(intent)
可以看看很多网友可能发现自己的Android程序有很多Activity,比如说主窗口A,调用了子窗口B,在B中如何关闭整个Android应用程序呢? 首先要说明在B中直接使用finish(),接下来手机显示的还是主窗口A,所以一起来看看是如何实现的吧. 1. Dalvik VM的本地方法 android.os.Process.killProcess(android.os.Process.myPid()) //获取PID,目前获取自己的也只有该API,否则从/proc中自己的枚举其他进程吧,不过要说明的是,结束其他进程不一定有权限,不然就乱套了。
System.exit(0); //常规java、c#的标准退出法,返回值为0代表正常退出2. 任务管理器方法 首先要说明该方法运行在Android 1.5 API Level为3以上才可以,同时需要权限android.permission.RESTART_PACKAGES,我们直接结束自己的package即可,直接使用ActivityManager类的restartPackage方法即可,参数为package name,该类通过getSystemService(Context.ACTIVITY_SERVICE)来实例化ActivityManager对象,这种方法系统提供的,但需要显示声明权限,所以使用中需要综合考虑。3. 根据Activity的声明周期 我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。在A窗口中使用下面的代码调用B窗口Intent intent = new Intent();
intent.setClass(Android123.this, CWJ.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG设置
startActivity(intent);接下来在B窗口中需要退出时直接使用finish方法即可全部退出。
我自己用到过的完全退出整个程序的方法。1.自己写一个Activitiy的管理类,最简单的是用一个List来保持,每开启一个activity,就将其加到List里。当你想完全退出程序时,你将List里的每个Activity都finish()掉就可以了。 不过个人不太喜欢使用这种方法。
2.在你的每个Activity里,注册一个特定的Broadcast,当你想退出程序时,就send一个特定的Broadcast,这样所有还没有finish的activity都可以接收到这个broadcast,接收到broadcast后,就finish掉Activity。这样该程序的所有Activity就finish了,也就达到了退出程序的效果。如果Activity很少么,建议不要这样使用,如果很多的话,推荐使用第2种方法。foresquare for android就使用过第2种方法。
用第二个方法现在有一个问题,我的程序完全退出不能是finish()方式,要把进程杀了,怎么解决?
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
System.exit(0);
public class MyActivity extends Activity
{
public static List<Activity> activityList = new ArrayList<Activity>(); @Override
protected void onCreate(Bundle savedInstanceState)
{ super.onCreate(savedInstanceState);
activity.add(this);
} @Override
protected void onDestroy()
{ super.onDestroy();
activity.remove(this); }
public static void killMyProcess()
{ for (Activity activity : activity)
{
activity .finish();
}
android.os.Process.killProcess(android.os.Process.myPid()); }
}
所有activity继承它然后调用killMyProcess()搞定
startActivity(intent);
finish();
代码大致如上,已经测试过了,完全成功。
@Override
public void onBackPressed() {
new AlertDialog.Builder(this).setTitle("Are you sure to exit?")
.setPositiveButton(android.R.string.ok, new OnClickListener() {
@Override
public void onClick(DialogInterface paramDialogInterface, int paramInt) {
try {
finish();
} catch (Exception e) {
}
finally{
System.exit(0);
}
}
}).setNegativeButton(android.R.string.cancel, null).show();
}
@Override
protected void onDestroy() {
System.exit(0);
}
这会造成一系统问题,比如该初始化的内存没有初始化,程序起动时设置的某些信息不存在了。因此我想到的是自已写一个退出方法,包掉所有未结束的组件,然后退出。类似
public static void exitSystem(Activity activity) {
List<Activity> list = Messager.getActivities();
for (int i = 0; i < list.size(); i++) {
Activity ac = list.get(i);
if (ac != null)
ac.finish();
list.remove(i);
}
stopKryoLookService(activity);
killAllConnections(activity);
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(startMain);
System.exit(0);
}
另外要考虑程序异常退出时,利用Thread.UncaughtExceptionHandler,来调用上面的方法!!
具体代码:
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
try {
Method forceStopPackage = ActivityManager.class.getDeclaredMethod( "forceStopPackage", String.class);
forceStopPackage.setAccessible(true);
forceStopPackage.invoke(am, packageName);
} catch (Exception e) {
Util.Log("stop", "stop error " + packageName);
e.printStackTrace();
}