Activity,Service,Broadcast其创建的背景线程的关系

在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仍然在运行



 





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值