1. 程式人生 > >關於activity前臺後臺切換

關於activity前臺後臺切換

[背景] 當一個業務流程涉及到多個task之間的互動,如一個Task_A中的Activity_1 startActivityForResult() 了一個Activity_2, Activity_2啟動另一個Task_B並且期望利用Task_B執行的結果setResult()返回給Activity_1。 TaskRecord如下圖所示: Android中怎麼切換task到前臺。
[問題] Task_B取得result之後,需要把Task_A帶到前臺(active),這樣Activity_1才能響應(onActivityResult)到Activity_2返回(setResult)的結果。 現在的問題就在於,Task_B並不一定能夠退出(Activity_3其可能其他程式,如browser等),從而把Task_A帶到前臺;又或者Task_A和Task_B中又夾雜了其他的Task(你知道,長按home鍵你可以做得出來),以至於呼叫Task_B.moveTaskToBack()也不能解決問題。 [解決方案]

如果你的平臺是面向Android3.0(API level 11),那麼恭喜你,一個函式就可以搞定:

moveTaskToFront 

Android中怎麼切換task到前臺。
Android中怎麼切換task到前臺。
SDK說,如果用帶FLAG_ACTIVITY_NEW_TASK標誌來啟動一個activity,並且這個activity與當前執行的另一個task(A)的affinity名字相同,那麼就這個activity就會在那個task(A)裡啟動。 Ok,到這還不行,人家沒說會把Task_A帶到前臺,接著看另一個Flag Android中怎麼切換task到前臺。
好了,重點來了:如果Task_A中已經有了Activity_2,這時候如果以FLAG_ACTIVITY_NEW_TASK來start Activity_2,那麼這個Task_A就會被帶到前臺
。 好了,現在Task_A已經可以到前臺了,剩下最後一步:Activity_2不能建立兩次,這就要求同時使用下面這個flag:
Android中怎麼切換task到前臺。
如果Activity_2在Task的頂端,那麼這個Activity_2就不會被再此建立,而是走onNewIntent. 至此,結合上面3個特性,問題得以解決。結合程式碼,流程如下: 1. 在androdiManifest.xml中新增Activity_2的taskAffinity name與Task_A相同(也就是與Activity_1的taskAffinity名字相同),如android:taskAffinity = "android.task.calendar"。 2. 在Task_B啟動前,Activity_1先啟動Activity_2並要求返回結果,startActivityForResult(). 3. Task_B中的Activity_4取得所需資料後,儲存好(intent,或其他方法),然後startActivity(Activity_2),並帶上(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_SINGLE_TOP)標誌。 4. Task_A被帶到前臺,並且呼叫到Activity_2::onNewIntent(). 5. Activity_2取得之前儲存的資訊(從Intent或其他地方),呼叫setResult(),然後finish(). 6. Activity_1中的onActivityResult()響應,得到返回結果。 總結下:
Android中怎麼切換task到前臺。

Android 顯示 Activity 到前臺

Java程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <uses-permission android:name="android.permission.REORDER_TASKS" /> public class SampleActivity extends Activity { private ActivityManager.RunningAppProcessInfo getRunningAppProcessInfo(String packageName) { ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> processList = am.getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo p : processList) { if (p.processName.equals(packageName)) { return p; } } return null; } private boolean isForeground(String packageName) { ActivityManager.RunningAppProcessInfo processInfo = getRunningAppProcessInfo(packageName); if (processInfo != null) { return ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND == processInfo.importance; } return false; } private boolean moveTaskToFront() { ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); am.moveTaskToFront(getTaskId(), 0); return isForeground(getPackageName()); } }
描述:getRunningAppProcessInfo 獲得當前程序的RunningAppProcessInfo; isForeground 判斷是否在前臺 moveTaskToFront 把Activity切換到前臺 有一個Android應用包含包含一個後臺程式,該程式會定期連線伺服器來實現自定義資訊的推送。但是,當這個應用處於前臺的時候,後臺程式就沒有必要連線伺服器了。這樣可以節省網路資源,也更省電。

用什麼方法知道該應用是否處於前臺呢?

網上搜到的方法大多數都是使用下面的程式碼:

1
2
3
4
5
6
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
//獲得task列表
List<ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1); 
Log.d("topActivity", "CURRENT Activity ::"+ taskInfo.get(0).topActivity.getClassName());
ComponentName componentInfo = taskInfo.get(0).topActivity;
componentInfo.getPackageName();

但是查閱Android文件後發現,google並不推薦使用這個方法:

This should never be used for core logic in an application, such as deciding between different behaviors based on the information found here. Such uses are not supported, and will likely break in the future. For example, if multiple applications can be actively running at the same time, assumptions made about the meaning of the data here for purposes of control flow will be incorrect.

而且,這個方法還要求設定android.permission.GET_TASKS許可權。

因此,我必須尋找更加合適的方法來做這件事。最終,我找到這個方法getRunningAppProcesses(),它並不需要增加特殊的許可權。

下面是範例程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * 返回當前的應用是否處於前臺顯示狀態
 * @param $packageName
 * @return
 */
private boolean isTopActivity(String $packageName) 
{
    //_context是一個儲存的上下文
    ActivityManager __am = (ActivityManager) _context.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> __list = __am.getRunningAppProcesses();
    if(__list.size() == 0) return false;
    for(ActivityManager.RunningAppProcessInfo __process:__list)
    {
        Log.d(getTAG(),Integer.toString(__process.importance));
        Log.d(getTAG(),__process.processName);
        if(__process.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
                __process.processName.
            
           

相關推薦

關於activity前臺後臺切換

[背景] 當一個業務流程涉及到多個task之間的互動,如一個Task_A中的Activity_1 startActivityForResult() 了一個Activity_2, Activity_2啟動另一個Task_B並且期望利用Task_B執行的結果setResul

Linux程式前臺後臺切換

1、在Linux終端執行命令的時候,在命令末尾加上 & 符號,就可以讓程式在後臺執行[email protected]$ ./tcpserv01 & 2、如果程式正在前臺執行,可以使用 Ctrl+z 選項把程式暫停,然後用 bg %[number]

Android 應用在後臺時,跳轉 Activity 會自動切換應用至前臺

本部落格 demo 見:demo。 平常用手機的時候經常碰到這種情況,用首屏廣告舉個栗子~很多應用都會有首屏廣告 activity A,假設此應用是 app C,如果此時要使用別的應用,就會使得 app C 在後臺執行。可是當 

Linux的bg和fg命令 ---讓程序在前臺後臺之間切換

前臺 現在 基本上 之間 怎麽 服務 bnu top 後臺運行 Linux的bg和fg命令 我們都知道,在 Windows 上面,我們要麽讓一個程序作為服務在後臺一直運行,要麽停止這個服務。而不能讓程序在前臺後臺之間切換。而 Linux 提供了 fg 和 bg 命令,讓我們

Android應用從後臺切換前臺因為資料被GC報異常

問題情景:     我們的應用在前臺執行,無論怎麼測試,我們的應用都是正常沒問題的,這時按下home鍵,手機回到桌面,我們的應用進入後臺,過了一段時間,我們把應用從後臺切換回前臺,這時測試時發現應用崩

安卓應用每次從後臺切換前臺都會啟動歡迎介面的問題

問題描述: 應用安裝後,通過安裝介面的開啟按鈕開啟應用,每當應用從後臺切換到前臺,都會啟動歡迎介面。如果是通過點選應用啟動,則沒有此問題。 解決方案: 在啟動介面的onCreate()方法裡新增如下程

Android 點選圖示使APP由後臺切換前臺重新啟動歡迎頁的問題

問題:當我們的APP切到後臺執行時,點選桌面的應用圖示使APP重新回到前臺,此時APP會重新啟動歡迎頁。 但是我們並不需要這種操作,我們需要直接把APP切至前臺。 解決:我們只需要在歡迎頁的onCr

【android學習】檢測android主屏,並把app從後臺切換前臺

1,需求:  因為專案需求,需要將app永遠保持前臺執行。  現已實現功能:   1)安裝app後,只要到桌面,手持會自動切換到app介面。   2)記錄退出介面,再次切換回app後依舊是原來的介面。 2,demo:  1)開一個執行緒,用於檢測app介面及切換介面。

模仿App後臺切換前臺顯示閃屏(廣告)頁面

感覺今年,後臺每一次切換到前臺,都顯示一次廣告頁面,這種實現的app越來越好,於是乎自己打算寫一個 1.感覺肯定是在生命週期的哪一個步驟之中觸發了這個功能,於是乎,寫了一遍生命週期,權當複習了, public class AdvActivity ex

springmvc和easyui使用ajax前臺後臺互傳數據,假刪除提示警告問題。

equal app ping logs div mapping sage sel spa 前臺 //刪除 多/單條數據 function del(cid){ var id=‘‘; if(cid==‘-1‘){ if(getSel

前臺後臺進程轉換問題

linux進程的前臺和後臺在linux中有程序在前臺和後臺切換的問題,前臺執行的會占用終端,不能釋放比如ping命令。這樣的命令就可以放在後臺執行,前臺還能繼續執行其他操作。看這個ping命令[[email protected] ~]# ping 127.0.0.1 PING 127.0.0.1 (

ajax 異步請求,json前臺後臺交互

ioe exceptio servlet set 後臺 通過 int oid function 直接上例子! 第一例: 1.導入json的相關jar包 2.後臺servlet代碼 public class ajaxtest extends HttpServlet {

activity波紋效果切換介面

Android的Material Design設計理念 帶來很多絢麗的動畫效果 新增依賴 compile ‘com.android.support:design:25.3.1’ 先上效果圖 Circular Reveal 官方將這一動畫稱為揭露效果

ajax前臺後臺互動資料的實列

三級聯動:就是平時我們填寫地址所需要填寫的省市縣的下拉框 但是不止是指三個下拉框繫結值就行 我們需要根據每一個級別去拿到他相對的資料(比如說根據湖南省去拿到長沙市) 然後這個值需要從資料庫傳過來  因為省市縣的資料太過繁瑣  所有我們需要把他簡化 實現:aja

Django學習手冊 - admin後臺 切換成中文顯示

測試 分享圖片 字段 後臺 註意 管理 dmi image 中文 Django admin後臺管理 切換成中文界面: 站點顯示為中文:   在setting 裏面修改 LANGUAGE_CORE = ‘zh-Hans‘    字段名顯示中文   

wordpress前臺後臺都一片空白的原因和解決辦法

今天登入一個給朋友維護的部落格,結果發現開啟網站後一片空白,後臺登陸頁面也是空白,還以為中毒了呢。在網上搜索了一下,終於找到並解決了wordpress前臺後臺都一片空白的原因和解決辦法。 首先,wordpress網站空白的可能原因有以下幾種: 1.網站更換主題模版 2.新安裝或升級外掛 3.

對於前臺後臺學習基礎的一個概念---什麼是前臺後臺

對於大神,這篇文章可以自動忽略。 對於一個暑假的懵逼的學習,或許對前臺和後臺的互動有了一點的認識。當初很迷茫的在專案上走了一個暑假的路,開始是學習的android方面的,幫實驗室維護一個專案,開始的時候感覺那些學長以前寫的那些專案很高大上(以前曾經看過他們的原始碼,結果沒看懂),認真看了之後

在同一個Activity下實現切換Fragment時重新整理fragment介面

在做專案時遇到一個問題,我在A fragment中展示從伺服器拿到的資料,在B fragment,新增資料到伺服器,同時B fragment同步重新整理,糾結了很久都不行,因為我建立fragment時用的是:show與hide switch (index) {

P2P金融借貸專案 前臺+後臺+資料庫原始碼+移動端後臺

P2P金融借貸專案 前臺+後臺+資料庫原始碼+移動端後臺 辛辛苦苦操了一個月的蛋,: 專案執行環境 專案需求 專案基本模組圖片 專案執行環境 本文件將從系統架構方面對系統進行綜合概

Android Studio 上Activity的互相切換

Activity上有兩個按鈕,切換到其他兩個Activity。 1、先建立兩個Button,一個Textview   2、給兩個Button新增監聽器,實現如下程式碼 public class MainActivity extends AppCompatActi