android 2.2如何完全退出程序??

heshuanghua 2010-10-11 08:44:20
//完全退出
//((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">

但是现在的问题是按照这种方法还是退不出!!!请教谁做过的,帮忙解决下。万分感激
...全文
8719 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
北爱歌 2013-03-12
  • 打赏
  • 举报
回复
引用 41 楼 skypeople 的回复:
测试过不只是activity多的问题,包括SERVICE(其他两种组件未测试过)。只要没有调用他们的相关的完成和结束方法,就算使用,android.os.Process.killProcess,或者发生异常,结束了当前的主线程和进程,android会马上再建一个新的进程和线程来继续那些没有结束的组件。 这会造成一系统问题,比如该初始化的内存没有初始化,程序起动时设置的某……
这个提醒了我,调用finish()之后就OK了
筱江 2013-01-30
  • 打赏
  • 举报
回复
是反射 刚写错了 写成发射了
筱江 2013-01-30
  • 打赏
  • 举报
回复
可以通过framework的方法去发射去关闭比较简单 具体代码: 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(); }
skypeople 2012-07-06
  • 打赏
  • 举报
回复
测试过不只是activity多的问题,包括SERVICE(其他两种组件未测试过)。只要没有调用他们的相关的完成和结束方法,就算使用,android.os.Process.killProcess,或者发生异常,结束了当前的主线程和进程,android会马上再建一个新的进程和线程来继续那些没有结束的组件。
这会造成一系统问题,比如该初始化的内存没有初始化,程序起动时设置的某些信息不存在了。

因此我想到的是自已写一个退出方法,包掉所有未结束的组件,然后退出。类似
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,来调用上面的方法!!
element_Leo 2011-12-19
  • 打赏
  • 举报
回复
好贴,学习了,不知道哪个有用?
Jobernowl 2011-11-11
  • 打赏
  • 举报
回复

@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);
}
greenredshark 2011-08-18
  • 打赏
  • 举报
回复
神贴啊,正在研究中
来到我身边 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 f059074251 的回复:]
要想杀死2.2以上的进程,必须先要把所有的activity先finish()掉才可以,如果你只有一个activity再调用Process.killProcess(id)就可以了。所以:
public class MyActivity extends Activity
{
public static List<Activity> activityList = new ArrayList<A……
[/Quote]

这方法可行,我说这哥们,你太帅了!
来到我身边 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 songdeng_1990 的回复:]
只要在调用下一个activity的语句之后,加上一个finish()即可,
startActivity(intent);
finish();
代码大致如上,已经测试过了,完全成功。
[/Quote]

这种方法能够杀死进程?算了,还是自己去实验吧!
songdeng_1990 2011-06-23
  • 打赏
  • 举报
回复
当然,最后一个activity,直接调用System.exit(0);
songdeng_1990 2011-06-23
  • 打赏
  • 举报
回复
只要在调用下一个activity的语句之后,加上一个finish()即可,
startActivity(intent);
finish();
代码大致如上,已经测试过了,完全成功。
苏纯 2011-06-01
  • 打赏
  • 举报
回复

2.3的怎么结束程序呢?
gongchengok 2011-05-16
  • 打赏
  • 举报
回复
我也遇到这个问题了,怎么解决呢?2.2版本以上的?
f059074251 2011-05-09
  • 打赏
  • 举报
回复
要想杀死2.2以上的进程,必须先要把所有的activity先finish()掉才可以,如果你只有一个activity再调用Process.killProcess(id)就可以了。所以:
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()搞定
傲慢的上校 2011-04-16
  • 打赏
  • 举报
回复
学习而来
xiao030305 2011-03-25
  • 打赏
  • 举报
回复
用介个,介个

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
System.exit(0);
sophialmy82 2011-02-24
  • 打赏
  • 举报
回复
就是,行了前面几种,都行不通.
zhouhaibo85 2011-01-27
  • 打赏
  • 举报
回复
看了这么多,结论只有一个,就是没有结束进程的接口

以上提供的几种方法都是只能在自己的应用程序里面实现退出的机制

但是我想不明白,为什么别人做的任务管理器就可以做到呢
liufeng21e 2011-01-17
  • 打赏
  • 举报
回复
有没有人来个结贴的,看完了也不知道到底用什么方法可以完全退出所有的activity?
xmuyzy 2011-01-11
  • 打赏
  • 举报
回复
正由这方面的需要,怎么感觉一个退出都这么麻烦哦
加载更多回复(22)

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧