在Activity里面启动一个Thread线程,当这个Activity里面被finish掉后,这个仍然运行的Thread线程是否会连同这个Activity一起被kill掉,今天思考了这样一个问题,为此专门做了下面的实验,得出下面的结论: 1 虽然掌管这个Thread线程的Activity(包括,Service,Broadcast组建)被finish掉,但这个Thread不会被系统停掉,仍然占用的CPU的资源,因此,如果你在Activity启动一个背景Thread去做一些耗时的操作,当你想finish调这个Activity时,你必须手工kill掉这个bg thread
为了验证以上结论,我设计了2个Activity ,分别是MainActivity; Activity1; 一个Service 用来监控当前Task里面的Activty
MainActivity如下
package hejin.com;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
ActivityManager mActivityManager;
Button bt1 ;
Button bt2 ;
Button bt3 ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startService(new Intent(MainActivity.this, MoniterService.class));
bt1 = (Button) findViewById(R.id.button1);
bt1.setOnClickListener(this);
bt2 = (Button) findViewById(R.id.button2);
bt2.setOnClickListener(this);
bt3 = (Button) findViewById(R.id.button3);
bt3.setOnClickListener(this);
}
@Override
protected void onDestroy(){
// TODO Auto-generated method stub
super.onDestroy();
this.finish();
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.button1:
MainActivity.this.startActivity(new Intent(MainActivity.this, Activity1.class));
break;
case R.id.button2:
MainActivity.this.startActivity(new Intent(MainActivity.this, Activity2.class));
break;
case R.id.button3:
MainActivity.this.startActivity(new Intent(MainActivity.this, Activity3.class));
break;
}
}
}
Activity1:
package hejin.com;
import android.app.Activity;
import android.app.ActivityManager;
import android.os.Bundle;
import android.util.Log;
public class Activity1 extends Activity {
/** Called when the activity is first created. */
ActivityManager mActivityManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity1);
Thread thread = new Thread(){
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.e("", "------Activity1 is running-----");
}
};
};
thread.start();
}
@Override
protected void onDestroy(){
// TODO Auto-generated method stub
super.onDestroy();
this.finish();
}
}
MoniterService:
package hejin.com;
import java.util.List;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
public class MoniterService extends Service {
private final int PRINTMESG = 1;
ActivityManager mActivityManager;
List<RunningTaskInfo> applist;
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch(msg.what){
case PRINTMESG:
applist = mActivityManager.getRunningTasks(1);
RunningTaskInfo runtask = applist.get(0);
Log.e("", "------------runtask.numActivities-------------:"+runtask.numActivities);
Log.e("", "------------runtask.topActivity-------------:"+runtask.topActivity.getClassName());
handler.sendEmptyMessageDelayed(PRINTMESG, 1000);
break;
}
};
};
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
mActivityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
applist = mActivityManager.getRunningTasks(1);
handler.sendEmptyMessageDelayed(PRINTMESG, 1000);
}
}
当在MainActivity 下 打印的Log信息如下:
11-24 15:23:38.297: E/(12176): ------------runtask.topActivity-------------:hejin.com.MainActivity
11-24 15:23:39.298: E/(12176): ------------runtask.numActivities-------------:1
当点击Button1 启动 Activity1时,打印的Log信息如下:
11-24 15:24:50.877: E/(12176): ------Activity1 is running-----
11-24 15:24:51.658: E/(12176): ------------runtask.numActivities-------------:2
11-24 15:24:51.658: E/(12176): ------------runtask.topActivity-------------:hejin.com.Activity1
当在Activity1时,按下back跳转到MainActivity,打印的Log信息如下:
11-24 15:26:02.918: E/(12176): ------Activity1 is running-----
11-24 15:26:02.978: E/(12176): ------------runtask.numActivities-------------:1
11-24 15:26:02.978: E/(12176): ------------runtask.topActivity-------------:hejin.com.MainActivity
显然由上面的log信息可以看出,虽然Activity1被finish后,它里面的Thread仍然在运行