您的位置:首页 > 其它

(4.2.16.3)判断某Activity是否在系统中存在?是否启动过?以及让它自行关闭

2015-08-31 19:01 756 查看


(1)acitvitymanager

有些时候,可能需要判断系统中是否存在某个Activity?它是否已经启动?

比如,如果我在某处判断ActivityMain要是存在并且已经启动过,我就启动它,以便它自行关闭!

[java] view
plaincopy





protected void startAndExit() {

logi(TAG, "---startAndExit---");

Intent intent = new Intent(this, ActivityMain.class);

ComponentName cmpName = intent.resolveActivity(getPackageManager());

boolean bIsExist = false;

if (cmpName != null) { // 说明系统中存在这个activity

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);

List<RunningTaskInfo> taskInfoList = am.getRunningTasks(10);

logi(TAG, "---startAndExit---taskInfoList.size:" + taskInfoList.size());

for (RunningTaskInfo taskInfo : taskInfoList) {

LogUtils.logi(TAG, "---startAndExit---taskInfo:"

+ taskInfo.baseActivity);

if (taskInfo.baseActivity.equals(cmpName)) { // 说明它已经启动了

bIsExist = true;

break;

}

}

}

logi(TAG, "---onStartAndExit---bIsExist:" + bIsExist);

if (bIsExist) {

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

intent.putExtra("isExit", (Boolean) true); //让它自行关闭

this.startActivity(intent);

}

}

如果某个Activity的运行模式被设置为singleTask或singleInstance,再次启动它,会触发它的onNewIntent方法。

[java] view
plaincopy





@Override

protected void onNewIntent(Intent intent) {

logi(TAG, "---onNewIntent---");

super.onNewIntent(intent);

if (intent.getBooleanExtra("isExit", false)) {

finish(); // 自行关闭

}

}

(二) isfinish()

由于多线程下载,在下载完成时,要回调Activity中的方法,但是,有可能用户在此期间已经点击了Back,Activity的onDestroy方法已经被调用,Activity已经被销毁,所以,下载线程在完成下载,回调时,要先判断Activity的状态,是否已经销毁掉,在网上查找答案,结果遇到一个说:

((Activity) mContext).isDestroyed();
可是到MyEclipse中,写了一下,代码提示,根本没有这个方法,真心坑爹啊,不过,有一个activity#isFinishing,写了个测试代码,发现可用,Activityon在Destroy之前,activity#isFinishing返回false,Activityon在Destroy之后,返回true。
测试线程代码如下:

import android.app.Activity;

public class MyThread extends Thread {

Activity activity;

public MyThread(Activity activity) {

super();

this.activity = activity;

}

@Override

public void run() {

super.run();

for (int i = 0; i < 3; i++) {

System.out.println(i + " activity:" + activity);

System.out.println(i + " isFinishing:" + activity.isFinishing());

try {

sleep(5000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

(三) adb shell命令 打印

进入到Android-sdk中platform-tools目录

在命令行中执行以下命令

adb shell dumpsys activity>activity.txt

可以将当前的四大组件(Activity,Service,BroadCase,ContentProvider)的存在情况打印到当前目录的activity.txt文件中

[java] view
plaincopy





@Override

protected void onNewIntent(Intent intent) {

logi(TAG, "---onNewIntent---");

super.onNewIntent(intent);

if (intent.getBooleanExtra("isExit", false)) {

finish(); // 自行关闭

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: