2010-01-10 13 views
3

J'ai créé une application qui permet à l'utilisateur de définir s'il veut recevoir une notification pendant que l'application s'exécute en mode arrière-plan. Si les notifications sont activées, une activité devrait être démarrée (la boîte de dialogue devrait apparaître sur l'écran).comment démarrer l'activité lorsque l'activité principale s'exécute en arrière-plan?

J'ai essayé de lui a permis de la manière suivante:

@Override 
public void onProductsResponse(List<Product> products) { 
    this.products = products; 
    moboolo.setProducts(products); 
    if(moboolo.getAutomaticNotificationsMode() != 0 && products.size() > 0){ 
     if(isRunningInBackground) 
     { 
      Intent intent = new Intent(this, ProductListActivity.class); 
      intent.setAction(Intent.ACTION_MAIN); 
      startActivity(intent); 
     } 
    } 
    drawProducts(products); 

} 

c'est la méthode de l'activité principale. Lorsque onPause() est exécuté, isRunningInBackground est défini sur true. Lorsque j'ai essayé de le déboguer lorsque l'application principale fonctionnait en arrière-plan, la ligne

startActivity (intention) n'a eu aucun effet (l'activité n'apparaissait pas).

Est-ce que quelqu'un sait comment modérer la logique afin de démarrer une activité de l'activité principale lorsque l'activité principale s'exécute en arrière-plan (après l'appel de onPause())?

Merci.

Répondre

7

Vous ne pouvez pas forcer Activity à apparaître à partir d'une application exécutant l'arrière-plan. The documentation says:

Si l'application est en cours d'exécution en arrière-plan et a besoin de l'attention de l'utilisateur, l'application doit créer un notificaiton qui permet à l'utilisateur de répondre à sa convenance.

Si votre Activity est en pause l'utilisateur peut faire quelque chose d'autre dans une autre application et ne veut probablement pas votre Activity soudainement apparaissant au-dessus de ce qu'ils font actuellement.

Vous devez utiliser un Status Bar Notification. Cela permet à votre application de placer une icône dans la barre d'état. L'utilisateur peut alors faire glisser le tiroir de la barre d'état et cliquer sur votre notification pour ouvrir votre application et afficher le Activity correspondant. C'est ainsi que la grande majorité des applications Android avertissent l'utilisateur lorsqu'il s'exécute en arrière-plan.

+0

Super! C'est encore mieux. –

1
Intent i= new Intent("android.intent.category.LAUNCHER"); 
i.setClass(getApplicationContext(), MyActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
PendingIntent i2 = PendingIntent.getActivity(getApplicationContext(), 0, insIntent,Intent.FLAG_ACTIVITY_NEW_TASK); 
try { 
    i2.send(getApplicationContext(), 0, i); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Et onCreate de MyActivity ...

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

Cela apportera votre activité à l'événement avant si l'activité principale est en cours d'exécution en arrière-plan.

2

Pour terminer la réponse de Hemendra, vous n'avez pas besoin de ces drapeaux, sauf FLAG_ACTIVITY_REORDER_TO_FRONT. Vous avez juste besoin de créer un PendingIntent à partir de votre intention normale et d'appeler la méthode send() de PendingIntent pour distribuer l'intention. Voici comment je l'ai fait:

Intent yourIntent = new Intent(this, YourActivity.class); 
// You can send extra info (as a bundle/serializable) to your activity as you do 
// with a normal intent. This is not necessary of course. 
yourIntent.putExtra("ExtraInfo", extraInfo); 
// The following flag is necessary, otherwise at least on some devices (verified on Samsung 
// Galaxy S3) your activity starts, but it starts in the background i.e. the user 
// doesn't see the UI 
yourIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, 
                 yourIntent, 0); 
try { 
    pendingIntent.send(getApplicationContext(), 0, yourIntent); 
} catch (Exception e) { 
    Log.e(TAG, Arrays.toString(e.getStackTrace())); 
} 
+0

Merci, en utilisant un PendingIntent ici était clé pour moi. Auparavant, je tentais d'appeler startActivity directement, ce qui ne fonctionne pas. –