2014-09-12 44 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; 
}