2015-11-26 3 views
0

Je fais une application d'alarme. J'ai 3 Activités: Main, Alarm, Game.Comment chaîner correctement des activités avec de nouvelles tâches?

Ils sont déclarés dans le manifeste:

<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" 
     /> 

activité Alarm est appelée à partir broadcastreciever:

Intent i = new Intent(context, NotificationActivity.class); 
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(i); 

Ou du `onBackPressed du jeu:

if (!test) { 
    Intent i = new Intent(mContext, NotificationActivity.class); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(i); 
} 
finish(); 

activité Game est appelée à partir d'alarme activité de manière similaire:

i = new Intent(this, BubblePopActivity.class); 
i.putExtras(b); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(i); 

Il n'y a aucun appel interne à l'activité Main.

Behaiviour Je Tring à atteindre:

1) Activités Alarm et Game doivent figurer sur les deux lockscreen nad déverrouillé verrouillé avec la broche, le motif grafical et ainsi de suite. Il travaille avec drapeaux decrared dans des activités, ce qui exige FLAG_NEW_TASK dans l'intention

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) Retour bouton doit conduire de Game activité à Alarm activité 3) Si home est pressé, alors que Alarm ou Game activité est au-dessus de pile, l'icône lanceur devrait les rouvrir, mais pas le Main, tant que ces activités ne sont pas terminées par la logique de l'application.
Alors que 1) et 2) fonctionne flowlesly, 3) fonctionne occasionnellement. Parfois, il retourne à Game de Alarm comme il se doit. Il semble que si ces activités ont été détruites par le système en raison d'un manque de ressources, l'icône du lanceur mènera à l'activité Main.
Comment puis-je implémenter la logique désirée?

Répondre

0

J'ai ajouté des constantes de préférence partagées. Lorsque je lance une activité principale, je vérifie si l'alarme a été dissoute par l'utilisateur, puis je la lance normalement, sinon je lance une activité d'alarme.

@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 
}