Android 在安裝完成界面,點擊打開應用程序。在應用程序點擊home鍵,再從桌面打開程序導致產生多個實例或者說程序被重複打開。(爲了把問題寫清楚,標題一定要長長長........)

本博純屬個人開發記錄, 

轉載請註明出處:http://blog.csdn.net/etong_123/article/details/22897731


       問題標題都已經寫明瞭,就是在普通的安裝apk完成之後,會遇到的一種情況。基本上在程序的AndroidManifest.xml裏面沒有對Activity的屬性做特殊處理都會出現這種情況,具體現象可以自己寫個demo安裝看看。

               原理:

       爲了瞭解問題產生的原因,首先,我們先來講一下Android的任務棧的機制:

       任務棧就是用來存放應用程序的Activity的地方,Android默認在打開應用程序的時候給每個應用單獨分配一個任務棧,用來管理應用程序Activity間的跳轉,返回。每個Activity都可以配置一個屬性叫taskAffinity,每個Activity默認的taskAffinity是以應用程序的包名命名的,爲什麼要提到這個呢,這個點後面會講到,接下去看。

       一般來說,每個應用都單獨跑在自己的任務棧上,但是我們也可以讓兩個應用程序跑在同一個任務棧裏面。我們可以從一個應用程序裏面啓動跳轉到另一個應用程序裏面。跳轉的代碼一般有兩種寫法:

      代碼1:從程序1跳轉到程序2之後,兩個應用程序是跑在同一個任務棧裏面的。

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. Intent intent=new Intent("android.intent.action.MAIN");  
  2.         intent.setComponent(new ComponentName("com.et.demo","com.et.demo.TestActivity"));  
  3.         startActivity(intent);  

      代碼2:從程序1跳轉到程序2之後,兩個應用程序是跑在各自的任務棧裏面的。

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. Intent intent=new Intent("android.intent.action.MAIN");  
  2.         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  3.         intent.setComponent(new ComponentName("com.et.demo","com.et.demo.TestActivity"));  
  4.         startActivity(intent);  

     一開始我以爲桌面的打開方式和安裝完成界面的打開方式不同在於Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)這句話上,之後看了下源碼,發現其實兩者差不多,基本上都有加New_Task這句話,所以我也搞不明白爲什麼出現打開方式錯誤的問題。(之前搞錯了。。。囧)。

    不過,解決方案已經出爐了,所以秉着先解決問題的原則,我們先上解決方案。(呵呵,這是什麼原則!)     

    

       解決方法:

      接下來呢,各位童鞋,我們來學習一個詞,叫“曲線救國”。好吧,方法的確是有點曲線,但是效果不錯,上菜。

       思路:

     1、先在你的應用程序裏新建一個Activity,將它設置爲首頁(你懂de),讓它跑在獨立的Task上面。

     2、將這個Activity作爲跳轉頁面,新建Task(代碼2)跳轉到你的程序“真正”的首頁上(你又懂de),銷燬掉這個Activity,連帶它的Task。

     3、這樣你的程序就跑在了自己獨立的Task上面了,就不會出現打開多個實例的問題了。

     實現:

      新建FirstActivity,在manifest配置屬性(最重要的部分

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <activity  
  2.             android:name="com.example.opentest.FirstActivity"  
  3.             android:configChanges="keyboardHidden|orientation|fontScale"  
  4.             android:label="@string/title_activity_first"  
  5.             android:excludeFromRecents="true"  
  6.             android:taskAffinity="com.example.opentest.first"  
  7.             android:windowSoftInputMode="adjustPan" >  
  8.             <intent-filter>  
  9.                 <action android:name="android.intent.action.MAIN" />  
  10.   
  11.                 <category android:name="android.intent.category.LAUNCHER" />  
  12.             </intent-filter>  
  13.             <intent-filter>  
  14.                 <action android:name="android.intent.action.CREATE_SHORTCUT" />  
  15.             </intent-filter>  
  16.         </activity>  

       我的程序包名是com.example.opentest,這裏我們將FirstActivity的屬性設置一下

       android:taskAffinity="com.example.opentest.first"

       這樣是爲了讓它自己跑在獨立的Task上。(你自己好好反省一下吧,哼)。

       而另一個重要的屬性:

        android:excludeFromRecents="true"

       作用是隱藏Task(即讓你的Task不出現在長按home出現的界面裏)。

     然後在FirstActivity代碼中:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. Intent intent=new Intent(this, MainActivity.class);  
  2. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  3. startActivity(intent);  
  4.              finish();  

      新建任務棧跳轉到我的“真正”首頁,銷燬自己(自我犧牲精神——哎喲,不錯哦)。

      這樣的做法其實就是自己寫個跳轉頁面,然後在跳轉頁面寫自己的跳轉方式,保證自己的程序的打開方式和Launcher一樣。同時在用完這個Activity的時候finish它,順便隱藏它的Task。

      這樣就解決了程序重複打開的問題了。但是這樣就行了麼? nonono,圖樣。這樣做在每次打開應用的時候動畫效果會很差,會出現跳轉兩次的閃屏,不信你試試。

      要怎麼做呢,我們先把FirstActivity中的setContentView的代碼直接刪掉,然後在style文件裏面寫個style

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <style name="WindowIsTranslucent">  
  2.       <item name="android:windowIsTranslucent">true</item>  
  3.       <item name="android:windowAnimationStyle">@+android:style/Animation.Translucent</item>  
  4.     </style>  

     android:windowIsTranslucent:Activity背景透明。

     android:windowAnimationStyle你可以指定你的Activity的加載動畫。

     然後在manifest裏將FirstActivity的theme指定一下就可以了。這樣出來的效果就好很多了。雖然解決方法有點取巧,但是效果還不錯。

         總結一下,雖然問題不是很常見,解決方法也不是特別難,但是對於一個軟件來說,第一次打開的時候出現程序問題肯定會給用戶一個很不好的印象。目前很多app(像百度視頻,hao123瀏覽器什麼的)都還有存在這個問題,上網找了一下,發現都沒有解決方案,既然解決了就跟大家分享一下。

       最後,完整的demo已放出,各位看官覺得好的請點贊。

        下載地址:http://download.csdn.net/detail/etong_123/7148307

發佈了29 篇原創文章 · 獲贊 7 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章