finish、killProcess 使用必知_one App two Activity

来源:互联网 发布:淘宝申诉进程在哪看 编辑:程序博客网 时间:2024/04/30 12:03

接着  finish、killProcess 使用必知_one App onr Activity 聊吧!


现在情况是这样的,Service (代码还是上篇的,没变化,在此就不粘贴了!)还是在后台检测 Task 的内容,另外一个 Project 有两个 Activity(TaskDemoActivity、SecondActivity),启动这个 Project,然后由 TaskDemoActivity 启动 SecondActivity。


两个 Activity 的布局界面很简单,就是一个按钮,TaskDemoActivity 的代码跟前面类似。

TaskDemoActivity 代码,就不详细贴出,唯一改变的是按钮事件,如下:


 public void onGo(View view) {
        Intent intent = new Intent(TaskDemoActivity.this, SecondActivity.class);
        startActivity(intent);
 }


其余的就是几个回调方法,然后打印其信息!


SecondActivity 代码,也没有什么东西,但是为了便于说明,还是附在下面。


package mark.zhang.demo;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class SecondActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        Log.d("mark", "SecondActivity === onCreate() ");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("mark", "SecondActivity === onResume() ");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("mark", "SecondActivity === onStart() ");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d("mark", "SecondActivity === onRestart() ");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d("mark", "SecondActivity === onPause() ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("mark", "SecondActivity === onStop() ");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("mark", "SecondActivity === onDestroy() ");
    }

    public void onOver(View view) {
        // 待续
    }
}


ok, 废话一大堆,下面开始正式工作。


第一个测试:


 public void onOver(View view) {
         android.os.Process.killProcess(android.os.Process.myPid());
 }


Service 侦测到 Task 里面还是有 TaskDemoActivity,这说明 killProcess 方法不可以结束整个 App,只是结束 Activity 本身(SecondActivity)。


第二个测试:


 @Override
 protected void onDestroy() {
        super.onDestroy();
        Log.d("mark", "SecondActivity === onDestroy() ");
        android.os.Process.killProcess(android.os.Process.myPid());
 }


 public void onOver(View view) {
       finish();
 }


先看 TaskDemmoActivity 的生命周期变化(TaskDemoActivity --- 点击按钮 --- SecondActivity --- 点击按钮):


D/mark    (  367): TaskDemoActivity === onCreate() 
D/mark    (  367): TaskDemoActivity === onStart() 
D/mark    (  367): TaskDemoActivity === onResume() 
D/mark    (  367): TaskDemoActivity === onPause() 
D/mark    (  367): TaskDemoActivity === onStop() 
D/mark    (  367): TaskDemoActivity === onRestart() 
D/mark    (  367): TaskDemoActivity === onStart() 
D/mark    (  367): TaskDemoActivity === onResume()


可以看出, TaskDemoActivity 并没有调用 onDestroy,说明没有结束这个 App。但是,结果是 TaskDemoActivity 没有在前台,直接回到了主界面Home。


最让人郁闷的是 Service 很久一段时间都会检测到该 Activity 的存在,3-4s 之后 Service 检测不到 TaskDemoActivity 了!按理说 TaskDemoActivity 会一直在阿,为什么过一会就没有了呢?


如果,在此启动这个 App,会发现 TaskDemoActivity 会这样:


D/mark    (  367): TaskDemoActivity === onCreate() 
D/mark    (  367): TaskDemoActivity === onStart() 
D/mark    (  367): TaskDemoActivity === onResume() 


那麽,SecondActivity 的生命周期变化:


D/mark    (  367): SecondActivity === onCreate() 
D/mark    (  367): SecondActivity === onStart() 
D/mark    (  367): SecondActivity === onResume() 
D/mark    (  367): SecondActivity === onPause() 
D/mark    (  367): SecondActivity === onStop() 
D/mark    (  367): SecondActivity === onDestroy() 


可以看出,SecondActivity 已经结束了!


这就说明,android.os.Process.killProcess(android.os.Process.myPid()) 不靠谱!有坑爹的嫌疑!


如果,你的 App 设计遇到类似的问题,请仔细测试!




原创粉丝点击