1

我在将单任务活动重新纳入视野时遇到了一些麻烦。

显现:

<activity
    android:name=".test.MyActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:icon="@drawable/my_launcher"
    android:label="@string/title_activity_my"
    android:launchMode="singleTask"
    android:taskAffinity=".myTask"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

我的活动代码:

Intent i = new Intent(getApplicationContext(), MyActivity.class);
i.putExtra("blah", stuff);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK); // I have tried almost every flag combo here!
startActivity(i);

设想:

在 onBackPressed() 活动调用 moveTaskToBack (隐藏我的活动)。收到特定的传入事件后,会调用上述意图代码,但是什么都没有发生!?!没有 OnNewIntent() 被解雇,没有 onCreate 被解雇......

但是:如果我还向 Notification 对象添加单独的 PendingIntent,它可以工作!?

    Intent notificationIntent = new Intent(getApplicationContext(),MyActivity.class);
    notificationIntent.putExtra("blah", stuff);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0,
            notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    Notification notif = new Notification(icon,text,when);
    notif.flags |= Notification.FLAG_ONGOING_EVENT;
    notif.setLatestEventInfo(getApplicationContext(), contentTitle, contentText, contentIntent);
    m_notifMgr.notify(1, notif);

我不明白为什么它可以通过 PendingIntent(触发 onNewIntent)而不是直接的 startActivity 调用。

请指教。谢谢。

更新(1):

我已经简化了事情并将相同的逻辑放入一个小型测试应用程序中:

Activity 'A' = singleTask,有两个按钮:btnStartTimer 启动计时器,btnMoveToBack 将 'A' 移到后面。当计时器到期时,调用创建“B”的意图。

活动“B”=普通的“hello world”屏幕。

结果:

(i) 如果我通过单击 btnStartTimer 启动计时器,并且不按 btnMoveToBack,则调用意图代码并出现“B”。

(ii) 如果我通过单击 btnStartTimer 启动计时器,并按下 btnMoveToBack,则仍会调用意图代码(由日志消息指示)并且不会出现“B”——日志显示未调用活动“B”onCreate。

这就提出了一个问题——我真的可以从未显示的活动中获得要处理的意图吗?

4

2 回答 2

5

我终于破解了这个。看起来,意图(有任何后果)不能从暂停的 ( singleTask) Activity 中触发。因此,我唯一的选择是实现一个IntentService(利用Intent标志FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_NEW_TASK),这反过来又创建了“重新显示”我的singleTask活动所需的意图。

敲碎核桃似乎有点像大锤,但这是我能找到的唯一有效的方法。

于 2013-07-02T16:50:56.123 回答
-1
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if (intent.hasExtra("KEY")) {
        int currentTab = intent.getIntExtra("KEY", 1);
        tabHost.setCurrentTab(currentTab);
    }
}
于 2014-10-30T07:23:10.453 回答