❶ android廣播打開軟體需要開起彈窗許可權
引導用戶打開相應許可權
獲取當前堆棧,判斷應用是否被打開,如果未被打開則強行將應用提至前台
經過測試,第一種方法無效。第二種方案是必備的,讓用戶打開許可權自然是最好的,第三種方法則是比較取巧的方法,這里著重講第三種方案
先判斷我們的界面是否已經被調用到前台
ActivityManager activityManager= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List list = activityManager.getRunningTasks(1);
if (list != null && list.size() > 0) {
ComponentName cpn = list.get(0).topActivity;
Log.e("className",""+cpn.getClassName());
if (className.equals(cpn.getClassName())) {
return true;
❷ Android 獲取當前棧頂activity
這個方法需要app獲取android.permission.REAL_GET_TASKS許可權
Android 5.0以上只對系統應用開放。
Android5.0以下需要添加許可權:
android.permission.GET_TASKS
❸ Android中的Activity詳解--啟動模式與任務棧
目錄
activity的簡單介紹就不寫了,作為最常用的四大組件之一,肯定都很熟悉其基本用法了。
首先,是都很熟悉的一張圖,即官方介紹的Activity生命周期圖.
情景:打開某個應用的的FirstActivity調用方法如下:
由於之前已經很熟悉了,這里就簡單貼一些圖。
按下返回鍵:
重新打開並按下home鍵:
再重新打開:
在其中打開一個DialogActivity(SecondActivity)
按下返回:
修改SecondAcitvity為普通Activity,依舊是上述操作:
這里強調一下 onSaveInstanceState(Bundle outState) 方法的調用時機:
當Activity有可能被系統殺掉時調用,注意,一定是被系統殺掉,自己調用finish是不行的。
測試如下:FirstActivity啟動SecondActivity:
一個App會包含很多個Activity,多個Activity之間通過intent進行跳轉,那麼原始的Activity就是使用棧這個數據結構來保存的。
Task
A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the back stack ), in the order in which each activity is opened.
即若干個Activity的集合的棧表示一個Task。
當App啟動時如果不存在當前App的任務棧就會自動創建一個,默認情況下一個App中的所有Activity都是放在一個Task中的,但是如果指定了特殊的啟動模式,那麼就會出現同一個App的Activity出現在不同的任務棧中的情況,即會有任務棧中包含來自於不同App的Activity。
標准模式,在不指定啟動模式的情況下都是以此種方式啟動的。每次啟動都會創建一個新的Activity實例,覆蓋在原有的Activity上,原有的Activity入棧。
測試如下:在FirstActivity中啟動FirstActivity:
當只有一個FirstActivity時堆棧情況:
此種模式下,Activity在啟動時會進行判斷,如果當前的App的棧頂的Activity即正在活動的Activity就是將要啟動的Activity,那麼就不會創建新的實例,直接使用棧頂的實例。
測試,設置FirstActivity為此啟動模式,多次點擊FirstActivity中的啟動FirstActivity的按鈕查看堆棧情況:
(其實點擊按鈕沒有啟動新Activity的動畫就可以看出並沒有啟動新Activity)
大意就是:
對於使用singleTop啟動或Intent.FLAG_ACTIVITY_SINGLE_TOP啟動的Activity,當該Activity被重復啟動(注意一定是re-launched,第一次啟動時不會調用)時就會調用此方法。
且調用此方法之前會先暫停Activity也就是先調用onPause方法。
而且,即使是在新的調用產生後此方法被調用,但是通過getIntent方法獲取到的依舊是以前的Intent,可以通過setIntent方法設置新的Intent。
方法參數就是新傳遞的Intent.
1.如果是同一個App中啟動某個設置了此模式的Activity的話,如果棧中已經存在該Activity的實例,那麼就會將該Activity上面的Activity清空,並將此實例放在棧頂。
測試:SecondActivity啟動模式設為singleTask,啟動三個Activity:
這個模式就很好記,以此模式啟動的Activity會存放在一個單獨的任務棧中,且只會有一個實例。
測試:SecondActivity啟動模式設為singleInstance
結果:
顯然,啟動了兩次ThirdActivity任務棧中就有兩個實例,而SecondActivity在另外一個任務棧中,且只有一個。
在使用Intent啟動一個Activity時可以設置啟動該Activity的啟動模式:
這個屬性有很多,大致列出幾個:
每個啟動的Activity都在一個新的任務棧中
singleTop
singleTask
用此種方式啟動的Activity,在它啟動了其他Activity後,會自動finish.
官方文檔介紹如下:
這樣看來的話,通俗易懂的講,就是給每一個任務棧起個名,給每個Activity也起個名,在Activity以singleTask模式啟動時,就檢查有沒有跟此Activity的名相同的任務棧,有的話就將其加入其中。沒有的話就按照這個Activity的名創建一個任務棧。
測試:在App1中設置SecondActivity的taskAffinity為「gsq.test」,App2中的ActivityX的taskAffinity也設為「gsq.test」
任務棧信息如下:
結果很顯然了。
測試:在上述基礎上,在ActivityX中進行跳轉到ActivityY,ActivityY不指定啟動模式和taskAffinity。結果如下:
這樣就沒問題了,ActivityY在一個新的任務棧中,名稱為包名。
這時從ActivityY跳轉到SecondActivity,那應該是gsq.test任務棧只有SecondActivity,ActivityX已經沒有了。因為其啟動模式是singleTask,在啟動它時發現已經有一個實例存在,就把它所在的任務棧上面的Activity都清空了並將其置於棧頂。
還有一點需要提一下,在上面,FirstActivity是App1的lunch Activity,但是由於SecondActivity並沒有指定MAIN和LAUNCHER過濾器,故在FirstActivity跳轉到SecondActivity時,按下home鍵,再點開App1,回到的是FirstActivity。
大致就先寫這么多吧,好像有點長,廢話有點多,估計也有錯別字,不要太在意~~~
❹ Android 任務棧
任務是指在執行特定作業時與用戶交互的一系列 Activity。 這些 Activity 按照各自的打開順序排列在堆棧(即返回棧)中。設備主屏幕是大多數任務的起點。當用戶觸摸應用啟動器中的圖標(或主屏幕上的快捷方式)時,該應用的任務將出現在前台。 如果應用不存在任務(應用最近未曾使用),則會創建一個新任務,並且該應用的「主」Activity 將作為堆棧中的根 Activity 打開。
當前 Activity 啟動另一個 Activity 時,該新 Activity 會被推送到堆棧頂部,成為焦點所在。 前一個 Activity 仍保留在堆棧中,但是處於停止狀態。Activity 停止時,系統會保持其用戶界面的當前狀態。 用戶按「返回」按鈕時,當前 Activity 會從堆棧頂部彈出(Activity 被銷毀),而前一個 Activity 恢復執行(恢復其 UI 的前一狀態)。 堆棧中的 Activity 永遠不會重新排列,僅推入和彈出堆棧:由當前 Activity 啟動時推入堆棧;用戶使用「返回」按鈕退出時彈出堆棧。 因此,返回棧以「後進先出」對象結構運行。
上述文字摘自 Android開發者官網
默認行為的場景 :當前的task包含4個activity–當前activity下面有3個activity。當用戶按下HOME鍵返回到程序啟動器(application launcher)後,選擇了一個新的應用程序(事實上是一個新的task),當前的task就被轉移到後台,新的task中的根activity將被顯示在屏幕上。過了一段時間,用戶按返回鍵回到了程序啟動器界面,選擇了之前運行的程序(之前的task)。那個task,仍然包含著4個activity。當用戶再次按下返回鍵時,屏幕不會顯示之前留下的那個activity(之前的task的根activity),而顯示當前activity從task棧中移出後棧頂的那個activity。
❺ Android 5.0以後如何獲取topActivity
RunningAppProcessInfo currentInfo = null;
Field field = null;
int START_TASK_TO_FRONT = 2;
String pkgName = null;
try {
field = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception e) {
return null;
}
ActivityManager manager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appList = manager.getRunningAppProcesses();
if (appList == null || appList.isEmpty()) {
return null;
}
for (RunningAppProcessInfo app : appList) {
if (app != null && app.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
Integer state = null;
try {
state = field.getInt(app);
} catch (Exception e) {
return null;
}
if (state != null && state == START_TASK_TO_FRONT) {
currentInfo = app;
break;
}
}
}
if (currentInfo != null) {
pkgName = currentInfo.processName;
}
return pkgName;
上述代碼走到field = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");這一句話的時候,走到了catch裡面,返回空值,上面這句話有錯嗎
❻ Android的任務棧
任務是指在執行特定作業(任務 task)時與用戶交互的activity。這些Activity按照各自打開的順序 排列在堆棧(返回棧)中。設備的屏幕 桌面的圖標(launcher)是多數據任務的的起點。當用戶觸摸應用啟動器中的圖標時,該用戶的任務將出現在前台。如果應用不存在任務(應用未曾使用),則會創建一個新的任務,並且該應用的"主Activity將作為堆棧中的根Activity打開"。
當Activity啟動另一個Activity時,該新Activity會被推送到堆棧的頂部,如果當前app只有一個棧 且app處於前台,那麼這個棧頂的Activity用戶應該是可見的,而啟動棧頂這個Activity(啟動者)仍然保留在堆棧中,但是是處於停止狀態。Activity停止時系統會保留其用戶信息 在Activity onSaveInstanceSate、 onRestoreInstanceState(Bundle savedInstanceState) 方法 具體可以查看這兩個方法。當用戶按"返回"按鈕時,當前Activity(所謂當前Activity一定是用戶可以看到的在棧頂的)會從堆棧頂部彈出(Activity被銷毀 走onDestory方法)這里說銷毀也不太嚴格 因為正常情況下會被銷毀 在不存在內泄漏導致Activity回收不掉的情況。棧頂的Activity被銷毀 它下面的Activity就會恢復執行(下面這個Activity露頭你可以看到它了)。堆棧中的Activity永遠不會重新排序,我們操作app的功能時 僅僅是 進入頁面(壓棧)退出頁面(彈棧),因此返回棧(彈棧)以 "後進先出"的對象結構運行。
任務是一個有機整體,當用戶開始新任務或通過點擊"home鍵" 這個時候應用會切換到「後台」,在後台時該任務中的所有Activity全部停止,但是任務的返回棧仍舊不變,也就是說,當另一個任務發生時,該任務僅是失敗焦點而已
如何更通過api查看當前應用中的任務
發現當前只有一個任務
同時通過這個任務我們可以查看當前棧頂的activity如下圖
❼ 如何得到Activities棧頂的Activity名稱
步驟:
1. 得到當前運行環境(context)的Activity管理器;
2. 通過Activity管理器得到當前的任務棧信息;
3. 從任務棧中獲得棧頂的Activity的名稱。
舉例 :
String getTopActivity(Activity context)
{
ActivityManager manager = (ActivityManager)context.getSystemService(ACTIVITY_SERVICE) ;
List runningTaskInfos = manager.getRunningTasks(1) ;
if(runningTaskInfos != null)
return (runningTaskInfos.get(0).topActivity).toString() ;
else
return null ;
}
最後不要忘記在AndroidManifest.xml中增加許可權:
❽ android中的任務棧,是一個任務棧包含前台任務棧和後台任務棧,還是任務棧分為前台的任務棧
任務棧分為前台的任務棧,當前activity活動所在的棧稱為前台任務棧。
❾ 安卓自動化測試怎麼獲取當前正在運行activity
android開發中獲取當前的Activity有多種情況; 在Activity中,this就是當前的Activity,例如this.startActivity。 在Fragment中可以通過 getActivity()來得到當前裝載這個Fragment的Activity。 通過Activity堆棧來獲取當前顯示的這個ActivityAc。詳細的可以看看安卓巴士教程:http://www.apkbus.com/thread-462912-1-1.html
❿ android利用adb命令,獲取當前界面(當前Task的棧頂).
開發項目中經常會遇到很多手機廠商製造的麻煩.如涉及許可權,程序授權(受信任應用),或service自啟動管理等.由於android手機種類繁多,廠商自製系統各自為王.弄得我們有時不得不針對固定的廠商或機型做定製開發.
本文就提供一種靠adb命令獲取手機當前activity的方法!
1.首先 要配置adb環境變數 這里就不多說了,自己網路就好了,非常簡單!
2.配置好環境變數後,就可以運用adb 命令了.
以OPPO r9S獲取自啟動管理界面為例:
將手機調好到指定界面後:打開cmd 輸入
1) adb devices //查看鏈接設備
adb shell mpsys activity top //獲取棧頂activity
![Q%T]T N0RQ0X{@ GP~TVZFG.png]( http://upload-images.jianshu.io/upload_images/3995903-d4895ea759168dc6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
2) 1.cmd命令中輸入:adb shell 進入shell命令模式
2.shell中輸入:logcat | grep ActivityManager 真機運行應用,可以實時 查看當前正在運行的Activity;
或者也可以用第二種方法.
至於用那種,看界面吧,這里第二種就不貼圖了.讀者自己去嘗試吧!
補充:已測試手機(為service開啟自啟動或設置受保護程序);