搞了好多天的android apk自動更新,終於有點結果了。現說下怎麼獲取activity棧裏的activty信息java
//get some activity information from stackandroid
ActivityManager manager = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE);app
List<RunningTaskInfo> runningTaskInfos = manager.getRunningTasks(5);this
if (runningTaskInfos != null) {code
if(runningTaskInfos.get(0)!=null){orm
ComponentName cn = runningTaskInfos.get(0).baseActivity;ci
if(cn!=null){get
Log.d(TAG, "pkg:" + cn.getPackageName());it
Log.d(TAG, "cls:" + cn.getClassName());io
}
Log.d(TAG, "running activity number is "+runningTaskInfos.get(0).numActivities);
}
}
須要添加權限
<uses-permission android:name="android.permission.GET_TASKS"/>
若是自動更新本身的app, install以後會發現棧底元素是
PackageName com.android.packageinstaller
ClassName com.android.packageinstaller.InstallAppProgress
若是在launch activity 的oncreate裏面有以下代碼
if (!isTaskRoot()) {
final Intent intent = getIntent();
final String intentAction = intent.getAction();
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) &&
intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
Log.d(TAG,"Main Activity is not the root. Finishing Main Activity instead of launching.");
finish();
}
}
那麼在install新app以後是進到finish()的判斷條件的, 這樣致使app重裝後不能重啓。須要進一步添加判斷。
附上app自動更新的實現:
//存儲到外部download文件夾
String downloadedFilepath=new StringBuffer().append(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)).toString();
//啓動install
String apkPath=downloadedFilepath+apkName;
Uri data = Uri.parse("file://"+apkPath);
intent.setDataAndType(data, "application/vnd.android.package-archive");
startActivity(intent);
//爲了使package installer上面有"打開"按鈕,須要先把全部acitivty清掉
//此處代碼省略,大體是使用在 application裏面建立的HashMap<String, Activity> map集合,而後獲取每一個activity,調用finish()方法。
須要用到的權限:
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />