㈠ android5.0之後,如何獲取當前頂端包名
//獲取到棧頂應用程序的包名
public String getTopActivty() {
String topPackageName="888";
//android5.0以上獲取方式
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
UsageStatsManager mUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
long time = System.currentTimeMillis();
List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 10, time);
if (stats != null) {
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
for (UsageStats usageStats : stats) {
mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
}
if (mySortedMap != null && !mySortedMap.isEmpty()) {
topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
Log.e("TopPackage Name", topPackageName);
}
}
}
//android5.0以下獲取方式
else{
List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(1);
ActivityManager.RunningTaskInfo taskInfo = tasks.get(0);
topPackageName = taskInfo.topActivity.getPackageName();
}
return topPackageName;
}
㈡ android activity 按back鍵 執行什麼過程
進程只是一個APP的容器,容器內的內容不會因為容器的空置而消失。但一旦容器被銷毀,容器中的內容也會隨之銷毀。當用戶按下back鍵時,實際上是執行了一個棧操作,具體來說就是棧頂元素被移除(即彈出,英文稱為pop操作)。這一過程會觸發棧頂Activity的onBackPressed()方法,默認情況下,這個方法會調用finish(),finish()方法則會進一步調用Activity的onDestroy()方法,從而銷毀當前Activity。
而當用戶按下home鍵時,系統的處理方式則是將整個任務棧掛起並放到後台,使用戶回到啟動器首頁。此時,Activity並未被銷毀,因此不會觸發Activity的onDestroy()方法。至於長按home鍵啟動任務管理器來結束應用,這種情況下,進程的存在與否則取決於具體的手機型號。一些手機可能會銷毀應用(即銷毀Application類的實例),但進程作為容器仍然存在,只是其中的內容為空。如果發現進程消失,通常是因為系統回收了空進程。而在另一些手機上,直接結束進程的操作可能會導致整個進程被徹底銷毀。
綜上所述,按下back鍵和home鍵的不同處理方式,導致了兩種不同的結果:一種是銷毀當前Activity並調用其生命周期方法;另一種則是簡單地掛起任務棧並將其移至後台,僅在用戶再次啟動應用時才會重新載入。
需要注意的是,進程的空置並不意味著其完全消失,這與進程的生命周期管理緊密相關。在某些情況下,即使應用未運行,其對應的進程也可能仍然存在於後台,等待下次需要時被重新激活。
㈢ Android 深入探討sigleTask和singletop的區別
區別就是設置singleTop屬性的Activity啟動時,如果它在棧頂,那就不創建這個Activity的實例,否則就創建一個新的實例
設置singleTask屬性的Activity,後退棧里只能有一個實例,如果啟動時棧中已有它的實例,會把這個Activity放到棧頂,intent傳給它,同時結束掉棧中原來在它下面的Activity,否則就創建一個新的實例
這么說太繞口,舉個栗子
A和B是兩個Activity,當前後退棧中的順序A→B(前面是棧底後面是棧頂)
如果A什麼都沒設置(默認的啟動方式Standard)
啟動A,棧中狀態變為A→B→A
啟動A,棧中狀態變為A→B→A→A
...
如果A設置了SingleTop
啟動A,棧中順序變為A→B→A,重新創建了一個A的實例
如果這時再啟動A,棧中順序還是A→B→A,啟動A的intent將傳給棧頂的A的實例,被傳給A的onNewIntent方法
也就是A在棧頂的時候,不會再創建A的實例,否則就創建新實例
如果A設置了SingleTask
啟動A,後退棧中就只有A了,因為棧中已經有了一個A的實例,那麼就把A放到棧頂,同時把原來在A上面的B給結束掉
也就是不論A在棧中什麼位置都不會再創建A的實例,只是把這個實例放到棧頂,同時結束掉原來在它之上的所有Activity