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

(1)acitvitymanager

有些时候,可能需要判断系统中是否存在某个Activity?它是否已经启动?
比如,如果我在某处判断ActivityMain要是存在并且已经启动过,我就启动它,以便它自行关闭!

[java]  view plain copy
  1. protected void startAndExit() {  
  2.     logi(TAG, "---startAndExit---");  
  3.     Intent intent = new Intent(this, ActivityMain.class);  
  4.     ComponentName cmpName = intent.resolveActivity(getPackageManager());  
  5.     boolean bIsExist = false;  
  6.     if (cmpName != null) { // 说明系统中存在这个activity  
  7.         ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);  
  8.         List<RunningTaskInfo> taskInfoList = am.getRunningTasks(10);  
  9.         logi(TAG, "---startAndExit---taskInfoList.size:" + taskInfoList.size());  
  10.         for (RunningTaskInfo taskInfo : taskInfoList) {  
  11.             LogUtils.logi(TAG, "---startAndExit---taskInfo:"  
  12.                     + taskInfo.baseActivity);  
  13.             if (taskInfo.baseActivity.equals(cmpName)) { // 说明它已经启动了  
  14.                 bIsExist = true;  
  15.                 break;  
  16.             }  
  17.         }  
  18.     }  
  19.     logi(TAG, "---onStartAndExit---bIsExist:" + bIsExist);  
  20.     if (bIsExist) {  
  21.         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
  22.         intent.putExtra("isExit", (Boolean) true); //让它自行关闭  
  23.         this.startActivity(intent);  
  24.     }  
  25. }  

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



[java]  view plain copy
  1. @Override  
  2. protected void onNewIntent(Intent intent) {  
  3.     logi(TAG, "---onNewIntent---");  
  4.     super.onNewIntent(intent);  
  5.     if (intent.getBooleanExtra("isExit"false)) {  
  6.         finish(); // 自行关闭  
  7.     }  
  8. }  





(二)  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 plain copy
  1. @Override  
  2. protected void onNewIntent(Intent intent) {  
  3.     logi(TAG, "---onNewIntent---");  
  4.     super.onNewIntent(intent);  
  5.     if (intent.getBooleanExtra("isExit"false)) {  
  6.         finish(); // 自行关闭  
  7.     }  
  8. }  

你可能感兴趣的:((4.2.16.3)判断某Activity是否在系统中存在?是否启动过?以及让它自行关闭)