2014-09-12 105 views
0

簡短版本: 我正在尋找一種通過操作(如掃描NFC標籤)來啓動應用程序的方法,該操作將會帶來upp應用程序。如果在後臺已經有一個活動,它應該提出來。Android:通過操作打開並恢復(即掃描NFC標籤)

我對任務和活動歷史有點困惑。

長版本: 我正在構建一個支持NFC的應用程序。我有啓動活動LoginActivity,用於登錄用戶,另一個活動MainActivity登錄進程之後的所有其他活動。

我可以掃描NFC標籤進行登錄。但是我還想掃描NFC標籤以調出應用程序,如果它沒有焦點。我希望它可以啓動應用程序並調出默認行爲的LoginActivity。或者,如果應用程序在後臺運行,我希望它恢復,這通常意味着恢復MainActivity。

我已配置應用程序以偵聽NFC掃描操作,Android可以選擇應用程序作爲啓動器進行操作。但問題是,我不知道如何讓它恢復活動(如果有的話),或者只是在啓動器活動尚未啓動的情況下啓動應用程序。我可以讓他們中的一個工作。

最接近我想要的是讓它在應用程序處於後臺時掃描標籤時打開LoginActivity。如果我在這個LoginActivity上再次掃描,它會調出MainActivity(如果我以前在沒有標籤的情況下「正常」運行應用程序之前登錄過)。 我已經嘗試了很多。

運行「亞行外殼dumpsys活動」給我這個輸出後,我已經到應用程序完全記錄一次,然後最小化,並掃描NFC標籤:如果我掃描NFC標籤再次

Running activities (most recent first): 
    TaskRecord{44f7d8d0 #565 A=com.android.nfc U=0 sz=1} 
    Run #3: ActivityRecord{434997e8 u0 com.example.admin/.activities.LoginActivity t565} 
    TaskRecord{448674c8 #564 A=com.example.admin U=0 sz=2} 
    Run #2: ActivityRecord{430afbc0 u0 com.example.admin/.activities.MainActivity t564} 
    Run #1: ActivityRecord{430889b8 u0 com.example.admin/.activities.LoginActivity t564} 
    TaskRecord{441daf90 #305 I=com.android.settings/.Settings$DataUsageSummaryActivity U=0 sz=1} 
    Run #0: ActivityRecord{43d9f730 u0 com.android.settings/.Settings$DataUsageSummaryActivity t305} 

我在MainActivity後得到這個出現:

Running activities (most recent first): 
    TaskRecord{448674c8 #564 A=com.example.admin U=0 sz=2} 
    Run #3: ActivityRecord{430afbc0 u0 com.example.admin/.activities.MainActivity t564} 
    TaskRecord{44f7d8d0 #565 A=com.android.nfc U=0 sz=1} 
    Run #2: ActivityRecord{434997e8 u0 com.example.admin/.activities.LoginActivity t565} 
    TaskRecord{448674c8 #564 A=com.example.admin U=0 sz=2} 
    Run #1: ActivityRecord{430889b8 u0 com.example.admin/.activities.LoginActivity t564} 
    TaskRecord{441daf90 #305 I=com.android.settings/.Settings$DataUsageSummaryActivity U=0 sz=1} 
    Run #0: ActivityRecord{43d9f730 u0 com.android.settings/.Settings$DataUsageSummaryActivity t305} 

這是我的AndroidManifest.xml:

<application 
    android:name="AdminApplication" 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" 
> 
    <activity 
     android:name="com.example.admin.activities.LoginActivity" 
     android:label="@string/app_name" 
     android:theme="@android:style/Theme.NoTitleBar" 
     android:screenOrientation="portrait" 
     android:configChanges="orientation|keyboardHidden" 
     android:alwaysRetainTaskState="true" 
     android:launchMode="singleTop" 
    > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.nfc.action.TAG_DISCOVERED"/> 
      <category android:name="android.intent.category.DEFAULT"/> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.example.admin.activities.MainActivity" 
     android:label="@string/title_activity_main" 
     android:screenOrientation="portrait" 
     android:configChanges="orientation|keyboardHidden" 
     android:alwaysRetainTaskState="true" 
     android:launchMode="singleTop" 
    > 
     <intent-filter> 
      <action android:name="intent.my.action"/> 
      <category android:name="android.intent.category.DEFAULT"/> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.nfc.action.TAG_DISCOVERED"/> 
     </intent-filter> 
    </activity> 
    <service android:name="com.example.admin.xmpp.XmppService"/> 
</application> 

回答

0

這似乎是解決這個問題的最好方法是將NFC標籤的DEFAULT類別設置爲最常用的活動,或者是處理標籤最方便的方法,然後讓邏輯來完成想要的結果。

在我的情況下,這是默認爲MainActivity,並在那裏做一個檢查,如果我們需要設置。如果沒有,請打開LoginActivity。我將最後一個NFC標籤意圖存儲在應用程序中,並可以從LoginActivity中讀取它。 對於MainActivity:

// Displays login using NFC Tag if tag is read without any active session. 
if (((AdminApplication) this.getApplication()).getUserToken() == null && getIntent().getAction().equals("android.nfc.action.TAG_DISCOVERED")) { 
    ((AdminApplication) this.getApplication()).setIntent(getIntent()); 
    Intent intent = new Intent(this, LoginActivity.class); 
    startActivity(intent); 
    finish(); 
    return; 
} 

而對於LoginActivity:

Intent intent = ((AdminApplication) this.getApplication()).getIntent(); 
if (intent != null) { 
    processNfcTagRead(intent); 
    return; 
}