如何正确地将活动与新任务联系起来?
How to properly chain activities with new tasks?
我正在制作报警应用程序。我有 3 个活动:Main
、Alarm
、Game
。
它们在清单中声明:
<activity
android:name=".MainActivity"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="sensorPortrait"
>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".Alarm"
android:excludeFromRecents="true"
android:launchMode="singleTask"
android:screenOrientation="sensorPortrait"
/>
<activity
android:name=".Game"
android:excludeFromRecents="true"
android:label="@string/search_word"
android:launchMode="singleTask"
android:screenOrientation="sensorPortrait"
/>
Alarm
activity 从 broadcastreciever 调用:
Intent i = new Intent(context, NotificationActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
或来自`Game's onBackPressed:
if (!test) {
Intent i = new Intent(mContext, NotificationActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
finish();
Game
activity 以类似的方式从警报 activity 调用:
i = new Intent(this, BubblePopActivity.class);
i.putExtras(b);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
没有对 Main
activity.
的内部调用
我要实现的行为:
1) 活动 Alarm
和 Game
应显示在锁定屏幕上,既解锁又使用 pin、grafical 模式等锁定。它适用于
活动中声明的标志,需要 FLAG_NEW_TASK in intent
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_bgame);
2) 后退按钮应该从 Game
activity 指向 Alarm
activity
3) 如果按下 home
,而 Alarm
或 Game
activity 位于堆栈顶部,启动器图标应该重新打开它们,而不是 Main
,因为只要这些活动没有被应用程序逻辑完成。
虽然 1) 和 2) 工作流畅,但 3) 偶尔工作。有时它 returns 到 Game
of Alarm
activity 因为它应该。看起来如果这些活动由于缺乏资源而被系统杀死,启动器图标将导致 Main
activity.
我怎样才能实现所需的逻辑?
我添加了共享首选项常量。当我启动 main activity 时,我检查警报是否被用户解除,然后正常启动,否则启动警报 activity。
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
boolean serviceIsRunning = isMyServiceRunning(AlarmService.class);
if (serviceIsRunning) {
boolean alarmRings = RingingAlarmUtil.getRingingAlarm(this).isExpired();
if (!alarmRings) {
Intent i = new Intent(this, NotificationActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
finish();
}
}
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
//normal launch staff
}
我正在制作报警应用程序。我有 3 个活动:Main
、Alarm
、Game
。
它们在清单中声明:
<activity
android:name=".MainActivity"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="sensorPortrait"
>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".Alarm"
android:excludeFromRecents="true"
android:launchMode="singleTask"
android:screenOrientation="sensorPortrait"
/>
<activity
android:name=".Game"
android:excludeFromRecents="true"
android:label="@string/search_word"
android:launchMode="singleTask"
android:screenOrientation="sensorPortrait"
/>
Alarm
activity 从 broadcastreciever 调用:
Intent i = new Intent(context, NotificationActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
或来自`Game's onBackPressed:
if (!test) {
Intent i = new Intent(mContext, NotificationActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
finish();
Game
activity 以类似的方式从警报 activity 调用:
i = new Intent(this, BubblePopActivity.class);
i.putExtras(b);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
没有对 Main
activity.
我要实现的行为:
1) 活动 Alarm
和 Game
应显示在锁定屏幕上,既解锁又使用 pin、grafical 模式等锁定。它适用于
活动中声明的标志,需要 FLAG_NEW_TASK in intent
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_bgame);
2) 后退按钮应该从 Game
activity 指向 Alarm
activity
3) 如果按下 home
,而 Alarm
或 Game
activity 位于堆栈顶部,启动器图标应该重新打开它们,而不是 Main
,因为只要这些活动没有被应用程序逻辑完成。
虽然 1) 和 2) 工作流畅,但 3) 偶尔工作。有时它 returns 到 Game
of Alarm
activity 因为它应该。看起来如果这些活动由于缺乏资源而被系统杀死,启动器图标将导致 Main
activity.
我怎样才能实现所需的逻辑?
我添加了共享首选项常量。当我启动 main activity 时,我检查警报是否被用户解除,然后正常启动,否则启动警报 activity。
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
boolean serviceIsRunning = isMyServiceRunning(AlarmService.class);
if (serviceIsRunning) {
boolean alarmRings = RingingAlarmUtil.getRingingAlarm(this).isExpired();
if (!alarmRings) {
Intent i = new Intent(this, NotificationActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
finish();
}
}
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
//normal launch staff
}