在Android中,Activity有个栈,一个Activity结信谈束掉,会回到上一个Activity,并不是退出应用程式。
Android中,退出应用程式的方式:
通过pid
int pid = android.os.Process.myPid()获取当前应用程式的PID
android.os.Process.killProcess(pid)杀死当前程序
这种方法退出应用,是会保留某些后进程,例如:Service,Notifications等。
2.通过ActivityManager
ActivityManager manager = (ActivityManager)context.getSystemService(ACTIVITY_SERVICE)获取应用程式管理器
manager.killBackgroundProcesses(getPackageName())强制结束当前应用程式
这种方式退出应用,会结束本应用程式的一切活动,因为本方法会根据应用程式的包名杀死所有程序包括Activity,Service,Notifications等。
呼叫System.exit(0);
其实还有一种方法也不错,把MainActivity设定为singleTop,先跳转到MainActivity然后finish就行,不过要注意停掉相应的Service
大家都知道 Android 的 Activity 是存著历史栈的,比如从 A ->B ->C,C 完成 finish 后喊森回到 B,把所有的Activity 都 finish了,程式就自然退出了。 当然在 finish 的同时也需要是否自己程式的其他资源。所以需要想个办法把 Activity 给存起来。然后在程式退出的地方呼叫它们的 finish()郑坦亩方法。
使用全域性变数。对了,第一个想到的就是继承 Application,程式码入下。
public class AgentApplication extends Application { private List<Activity>activities = new ArrayList<Activity>()public void addActivity(Activity activity) {activities.add(activity)} @Overridepublic void onTerminate() {super.onTerminate()for (Activity activity : activities) {activity.finish()}onDestroy()System.exit(0)}}
然后在 Activity onCreate 的时候来呼叫 addActivity (),有人可能想到这个Application需要在所有的 Activity onCreate的时候都使用,需要做一个单例例项。其实根本不需要。在 Activity 中使用 this.getApplication() 就可以了。
最后在你需要推出程式的地方呼叫 application.onTerminate() 就可以了。记住:super.onTerminate() 必须呼叫,程式码中的 onDestroy()是我自己的释放其他资源的方法,不是系统的。
执行以上程式码后,在LogCat 中会出现一行提示:
Process 包名 (pid xxxxx) has died. 证明你的程式退出了。现在你可以测试了。
有几种方法,一种是:程式退出时,下方有写 在按一次退出程式
第二种,进 设定-应用程式-正在执行 这一栏自己关
有时跳转的activity较多时,还需要多次按返回键,这样感觉一点都不爽。 后面添加了一个选单返回功能键,这个方法也只能用system.exit(0)来关闭当前活动的Activity,附程式码: public boolean onCreateOptionsMenu(Menu menu){super.onCreateOptionsMenu(menu)MenuItem item = menu.add(Menu.NONE, Menu.NONE, Menu.NONE, "Exit")item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener(){public boolean onMenuItemClick(MenuItem item){System.exit(0)return true}})return true}想到这样太不方便了,每次退出介面之后应用程式还在执行,今天查了下资料终于把这个问题给解决了, 网上提供了几种方法,我吸收了下面这个自认为简单易懂的方法,将下面SysApplication这个类复制到工程里面,然后在每个Acitivity的oncreate方法里面通过SysApplication.getInstance().addActivity(this)添加当前Acitivity到ancivitylist里面去,最后在想退出的时候呼叫SysApplication.getInstance().exit()可直接关闭所有的Acitivity并退出应用程式。 附程式码:import java.util.LinkedListimport java.util.Listimport android.app.Activityimport android.app.AlertDialogimport android.app.Applicationimport android.content.DialogInterfaceimport android.content.Intentpublic class SysApplication extends Application { private List mList = new LinkedList()private static SysApplication instanceprivate SysApplication() { } public synchronized static SysApplication getInstance() { if (null == instance) { instance = new SysApplication()} return instance} add Activity public void addActivity(Activity activity) { mList.add(activity)} public void exit() { try { for (Activity activity : mList) { if (activity != null) activity.finish()} } catch (Exception e) { e.printStackTrace()} finally { System.exit(0)} } public void onLowMemory() { super.onLowMemory()System.gc()} } 在应用程式里面 的activity的oncreate里面新增SysApplication.getInstance().addActivity(this)如:public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState)
你可以长按主屏键后,在其中关闭应用程式。但并不能完全退出执行记忆体
1、 Service不是分离开的进程,除非其他特殊情况,它不会运行在自己的进程,而是作为启动运行它的进程的一部分。2、 Service不是线程,这意味着它将在主线程里劳作。
启动service有两种方法:
1、 Context.startService()
调用者与服务之间没有关联,即使调用者退出,服务仍可运行
2、 Context.bindService()
调用者与服务绑定在一起,调用者一旦退出,服务也就终止
Service的生命周期
如果使用startService()启动service,系统将通过传入的Intent在底层搜索相关符合Intent里面信息的service。如果服务没有启动则先运行onCreate,然后运行onStartCommand (可在里面处理启动时传过来的Intent和其他参数),直到明显调用stopService或者stopSelf才将停止Service。无论运行startService多少次,只要调用一次stopService或者stopSelf,Service都会停止。使用stopSelf(int)方法可以保证在处理好intent后再停止。
控升弯制service运行的主要方式有两种,主要是根据onStartCommand方法返回的数值。方法:
1、START_STICKY
2、START_NOT_STICKY or START_REDELIVER_INTENT
这里主要轿笑行解释这三个变量的意义:
1、 START_STICKY
在运行onStartCommand后service进程被kill后闭哗,那将保留在开始状态,但是不保留那些传入的intent。不久后service就会再次尝试重新创建,因为保留在开始状态,在创建 service后将保证调用onstartCommand。如果没有传递任何开始命令给service,那将获取到null的intent
2、 START_NOT_STICKY
在运行onStartCommand后service进程被kill后,并且没有新的intent传递给它。Service将移出开始状态,并且直到新的明显的方法(startService)调用才重新创建。因为如果没有传递任何未决定的intent那么service是不会启动,也就是期间onstartCommand不会接收到任何null的intent。
Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy我们有两种方式启动一顷孝个Service,他们对Service生命周期的影响是不一样的。
1 通过startService,就是上面这种
Service会经历 onCreate -->onStart
stopService的时候直接onDestroy
如果弊毕是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行。
下次调用者再起来仍然可以stopService。
2 通过bindService
Service只会运行onCreate, 这个时候 调用者和Service绑定在一起
调用者退出了,Srevice就会调用onUnbind-->onDestroyed
所谓绑定在一起就共存亡了。
注意:Service的onCreate的方法只会被调用一次,
就是你无论多少次的startService又 bindService,Service只被创建一次。
如果先是bind了,那么start的时候就直接运行Service的onStart方法,
如果先是start,那么bind的时候就直租乎芹接运行onBind方法。如果你先bind上了,就stop不掉了,
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)