最近写程序遇到了一个比较麻烦的问题,需要在用户手动杀死app时做处理,原因是app通过websocket创建了一个房间,用户在退出房间时需要给其他人发送一个消息,让房间内的人把自己从各自的列表里去掉。
然而如果遇到用户通过手动划掉app(Home键任务管理)的话,我们是获取不到Activity的onDestory方法的,那就没办法处理退出房间的请求了。
原本是想着写一个service,在用户调出任务管理器时(会获取到onPause和onStop方法),启动service并不断判断activity是否存在,如果不存在则发送退出房间通知。
但是实际在测试的时候发现,当我启动service之后,再通过任务管理杀掉应用时,我的activity获得到了onDestory方法的调用!
Log如下,暂不清楚是何原理,如果有需要的可以自己试一下。
12-27 10:10:55.931 14821-14821/com.example.grantz.myapplication1 I/MainActivity: onCreate
12-27 10:10:55.932 14821-14821/com.example.grantz.myapplication1 I/MainActivity: onStart
12-27 10:10:55.934 14821-14821/com.example.grantz.myapplication1 I/MainActivity: onResume
12-27 10:10:55.952 14821-14821/com.example.grantz.myapplication1 I/MainActivity: serviceonCreate
12-27 10:10:55.983 488-809/? E/BufferQueueProducer: [com.example.grantz.myapplication1/com.example.grantz.myapplication1.MainActivity] connect: already connected (cur=1 req=1)
12-27 10:10:56.013 1228-1396/? I/ActivityManager: Displayed com.example.grantz.myapplication1/.MainActivity: +304ms
12-27 10:11:10.502 14821-14821/com.example.grantz.myapplication1 I/MainActivity: onPause
12-27 10:11:10.544 14821-14821/com.example.grantz.myapplication1 I/MainActivity: onStop
//-----------此处手动关闭app-----------
12-27 10:11:12.296 14821-14821/com.example.grantz.myapplication1 I/MainActivity: onDestroy
12-27 10:11:12.299 14821-14821/com.example.grantz.myapplication1 I/MainActivity: serviceonDestroy
此处是通过手动kill app的log。
service中并未做任何处理,仅仅是创建了一个service而已,使用的是startService方式启动的。
代码很简单
MainActivity
@Override
protected void onResume() {
super.onResume();
serviceStop();
Log.i("MainActivity","onResume");
}
public void serviceStart(){
Intent intent=new Intent(this,CheckAcitivityService.class);
startService(intent);
}
private void serviceStop(){
Intent intent=new Intent(this,CheckAcitivityService.class);
stopService(intent);
}
@Override
protected void onStop() {
super.onStop();
serviceStart();
Log.i("MainActivity","onStop");
}
@Override
protected void onDestroy() {
serviceStop();
super.onDestroy();
Log.i("MainActivity","onDestroy");
}
Service
public class CheckAcitivityService extends Service{
@Override
public void onCreate() {
Log.i("MainActivity","serviceonCreate");
super.onCreate();
}
@Override
public void onDestroy() {
Log.i("MainActivity","serviceonDestroy");
super.onDestroy();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
尚不知为何如此