1. 程式人生 > >Android實現不重複啟動APP的方法

Android實現不重複啟動APP的方法

轉載部落格:http://blog.sina.cn/dpool/blog/s/blog_5de73d0b0102vpai.html?utm_source=bshare&utm_campaign=bshare&utm_medium=weixin&bsh_bid=883565991

類似QQ、微信這樣的APP,一般都不會開啟兩個例項。
  比如:開啟QQ客戶端,進入到好友聊天介面,然後按HOME返回桌面
這時候有兩種情況:
  1、如果你在最近任務中切換會QQ客戶端,那麼還是顯示好友聊天介面
  2、如果點選QQ客戶端圖示開啟,依然顯示好友聊天介面
預設情況下是不可能實現上面的功能的。
但是,使用android:alwaysRetainTaskState='true',可以實現我們的需求。
我們要做的是:
  在Androidmanifest.xml檔案中,給根Activity加上android:alwaysRetainTaskState='true',就可以了。
  根Activity就是應用預設啟動的Activity,一般是歡迎頁面SplashActivity或主頁面MainActivity。
如下圖所示:

  

簡單解釋一下:
  android:alwaysRetainTaskState顧名思義就是【總是保留任務棧狀態】
  Task指的是任務棧,是用於記錄Activity開啟順序、儲存狀態等。
  如上圖,開啟客戶端的順序是 SplashActivity --> GuideActivity --> MainActivity
  (歡迎頁面 --> 功能引導頁面 --> 主頁面)
  那麼,它在任務棧中就是,

  

  由於我們在Androidmanifest.xml檔案中,給SplashActivity設定android:alwaysRetainTaskState='true',當我們按HOME鍵返回桌面,任務棧的狀態被保留著,當我們點選應用圖示開啟再次應用時,系統會判斷是否已經存在以SplashActivity為根Activity的棧,如果有,那麼就直接使用該棧,並顯示棧頂的Activity。注意,只需要設定根Activity就可以了。

最近發現了一個方法,
  它就是Activity.moveTaskToBack(boolean),這個方法可以把整個任務棧放到後臺執行,相當於PC視窗的最小化一樣!十分強大!一般來說,為了保證應用在後臺執行,提高再次開啟的速度,一般都不會直接finish(),(可以參考一下QQ、微信、微博這些長駐留應用)為了實現這個功能,比較通用的做法是在使用者按下返回鍵的時候,呼叫如下程式碼實現:

@Override
public void onBackPressed()
{
//按返回鍵返回桌面
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
}

  這個方法雖然可以實現我們所需功能,但是,如果有使用者安裝了多個桌面應用的時候,可能會提出對話方塊,要求使用者選擇一個桌面執行。但是,如果把程式碼改成這樣:

@Override
public void onBackPressed()
{
//按返回鍵返回桌面
moveTaskToBack(true);
}

  就不會出現上述問題了!!其它,QQ也是用這種方式實現的。有一點細微的差別。前者會返回桌面的預設頁面,後者返回桌面上次停留的頁面。

相關推薦

Android實現重複啟動APP方法

轉載部落格:http://blog.sina.cn/dpool/blog/s/blog_5de73d0b0102vpai.html?utm_source=bshare&utm_campaign=bshare&utm_medium=weixin&bsh_bid=883565991 類似

Android 響應系統分享,重複啟動app

最近專案中遇到幾個納悶的問題: 1、當在服務程序中發一個通知Notification,點選Notification啟動UI程序的某個Activity,發現MainActivity會再次被調起。 2、MainActivity響應系統分享的意圖時,應用再次重啟一遍app,當進入任務列表檢視時,會

通過adb shell 啟動APP方法

star pac resolve pre 搜索 stop ack xxx 應用apk 先列出手機上所有應用信息: adb shell dumpsys package > ./package.txt 從中找出你要的APP,重點關註 Activity Resolver T

生成資料庫自增重複ID的方法

namespace ConsoleApp1 { class Program { static void Main(string[] args) { var list = new HashSet<string>(101);

android service被kill的方法

private ActivityManager activityManager; activityManager = (ActivityManager) mcontext.getSystemService(Context.ACTIVITY_SERVICE); IntentFilter

Android實現延遲的幾種方法小結

本文例項總結了Android實現延遲的幾種方法。分享給大家供大家參考,具體如下: 一、通過Thread new Thread(){ public void run(){ sleep(***); } }.start(); 通過ProgressDialog的使用來

Android實現滑動的七種方法實踐

  在講解滑動之前,要先熟悉一下安卓的座標系。安卓檢視有兩個座標系,一個是Android座標系,一個是檢視座標系。前者以螢幕的最左上角為原點,向右為X軸正方向,向下為Y軸正方向。後者以父檢視的左上角為原點,其它與前者一致。   而獲取座標的方法也可以分為兩類,View提供的

Android實現非同步的幾種方法

在Android專案中,有經驗的開發人員都知道,一些耗時的IO操作等都必須在子執行緒中去操作,那麼可以有哪些方法來開啟子執行緒呢,一般可以使用Java中自帶的幾種方法,也可以使用Andorid特有的一些類。 用Java來實現非同步 主要有兩種方法來實現非同步

android 關於Toast重複顯示解決方法

 解決思路:   不用計算Toast的時間之類的,就是定義一個全域性的成員變數Toast, 這個Toast不為null的時候才去make,否則直接setText.為了按返回鍵後立即使Toast不再

Android實現滑動的幾種方法

下面通過一個例子來總結實現滑動的幾種方式,例子的主要功能就是讓我們的自定義View能夠隨著手指的移動而移動。 佈局檔案如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro

PHP 產生重複隨機數的方法(一)

1.首先通過rand()函式獲取一個長度固定的陣列。 例如:$numbers = rand(6,50); 這條語句是可以產生6到50個數字,是按順序排列的。 接著我們需要打亂這個順序,產生45個無序的陣列成一個數組,這時就需要用到php中的shuffle()函式。 例如:s

安裝xampp後apache啟動解決方法

有時,並不是安裝完VC9環境就可以直接執行Apache,其中一個重要的原因,便是Apache伺服器所使用的埠被其它程式佔用了,經典代表:迅雷。 解決辦法: 1.80埠衝突,解決方法: 開啟目錄C:\xampp\apache\conf(我的安裝目錄為C:\xampp)下的httpd.conf檔案,將Listen

Android實現滑動的7種方法

    在Android4.x之後,滑動操作大量的出現在Android系統中,滑動的操作方式具有更好的使用者體驗。所以本章會對Android中 實現滑動效果的方式做一個小歸納。     在介紹滑動方法前,先講一下Android的座標系,Android的座標系分為兩種。  

在Windows2003和Windows2008上禪道啟動解決方法

 禪道不能啟動,這樣的事情上次在Windows2003上發生過一次,這次又發生在2008上面,終究要耐心解決。異常狀態:托盤圖示無法啟動。查詢禪道的啟動機制,其分別啟動了apache,php,mysql.先查詢apacha。單獨啟動apache.exe,在command裡面會

Android實現開機自啟動某個程式

使用場景:手機開機後,自動執行程式,在螢幕上顯示”Hello. I started!”字樣。 背景知識:當Android手機啟動時,會發出一個系統廣播,叫做:ACTION_BOOT_COMPLETED,它的字串表示常量為android

一定範圍內取幾個重複的隨機數方法(php)

方法一: <?php //range 是將1到42 列成一個數組 $numbers = range (1,42); //shuffle 將陣列順序隨即打亂 shuffle ($numbers); //array_slice 取該陣列中的某一段

Android實現滑動的七種方法

1.layout方法 每次移動後,呼叫layout()方法對自己重新佈局從而達到移動的效果 @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) e

生成重複隨機數的方法 --抽獎問題等

問題描述: 給定一個n,一個m 要求在1 ~ n這n個數字中,生成m個不重複的隨機數。 思路: 生成隨機數大家都知道,C++中也提供了相關的函式——rand()。 但是問題中要求生成的是無重複的隨機數,這裡就需要對生成的隨機數進行去重操作了。 首選最

android通過命令列啟動app-

執行自動化測試時我們都必須先開啟 App 後才開始才進行測試,開啟 App 的動作我們可以透過 adb(Android Debug Bridge) 指令來幫我們完成,指令如下所示:      adb shell am start -n [PACKAGE-NAME]/[ACT

mysql dual 虛擬表實現重複外掛

看這條 sql:select sysdate(); 熟悉不!?雖然我不是狠熟悉,但我確定我用過它,其實他是:select sysdate() from dual 的簡寫。 看一下mysql官方對這個表的解釋吧(http://dev.mysql.com/doc/refman