Android:通过操作打开并恢复(即扫描NFC标签)

Android:通过操作打开并恢复(即扫描NFC标签),android,android-activity,Android,Android Activity,简短版本: 我正在寻找一种方法,通过一个动作(比如扫描NFC标签)来启动一个应用程序,这将为应用程序带来upp。如果已经有一个活动在后台,它应该把它 我对任务和活动历史有点困惑 长版本: 我正在构建一个支持NFC的应用程序。我有一个启动活动LoginActivity,用于登录用户,还有另一个活动MainActivity,用于登录过程之后的所有其他活动 我可以扫描NFC标签以登录。但我还想扫描一个NFC标签,如果它没有焦点,就打开这个应用程序。我希望它要么启动应用程序,要么启动LoginActiv

简短版本: 我正在寻找一种方法,通过一个动作(比如扫描NFC标签)来启动一个应用程序,这将为应用程序带来upp。如果已经有一个活动在后台,它应该把它

我对任务和活动历史有点困惑

长版本: 我正在构建一个支持NFC的应用程序。我有一个启动活动LoginActivity,用于登录用户,还有另一个活动MainActivity,用于登录过程之后的所有其他活动

我可以扫描NFC标签以登录。但我还想扫描一个NFC标签,如果它没有焦点,就打开这个应用程序。我希望它要么启动应用程序,要么启动LoginActivity,这将是默认行为。或者,如果应用程序在后台运行,我希望它只是恢复,这通常意味着恢复MainActivity

我已经将应用程序配置为监听NFC扫描操作,Android能够选择应用程序作为操作的启动程序。但问题是,我不知道如何让它恢复活动(如果有的话),或者如果尚未启动应用程序,就用启动程序活动启动应用程序。我可以让他们中的一个工作

如果我在后台扫描标记,最接近我想要的就是让它打开LoginActivity。如果我再次扫描此LoginActivity,它会显示MainActivity(如果我以前在运行应用程序“正常”且没有标记后登录)。 我做了很多实验

在我完全登录应用程序一次后,运行“adb shell dumpsys activity”(adb shell dumpsys activity)将提供此输出,然后将其最小化并扫描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}
如果我再次扫描NFC标签,我会在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>

解决这一问题的最佳方法似乎是将NFC标记的默认类别设置为将使用最多或最方便处理标记的活动,然后有逻辑执行所需的结果

在我的例子中,这是将其默认设置为MainActivity,并在那里检查是否设置了我们需要的内容。如果没有,请打开LoginActivity。我将最后一个NFC标记意图存储在应用程序中,并使其能够从LoginActivity中读取。 主要活动:

// 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;
}
Intent intent = ((AdminApplication) this.getApplication()).getIntent();
if (intent != null) {
    processNfcTagRead(intent);
    return;
}
对于后勤活动:

// 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;
}
Intent intent = ((AdminApplication) this.getApplication()).getIntent();
if (intent != null) {
    processNfcTagRead(intent);
    return;
}