2016-06-15 1 views
0

Si je fais startActivity() sur une activité dans un autre processus; Y a-t-il un bon moyen de recevoir un rappel au point de départ (en commençant le nouveau formulaire d'activité d'un service en arrière-plan) que la nouvelle activité a réellement démarré? Je veux dire que je peux faire une diffusion, mais cela semble boiteux. Y a-t-il un meilleur moyen pour cela?Rappel une fois que l'activité d'un autre processus a démarré?

+0

Qu'en est-il d'une interface? –

+0

Comment voulez-vous dire? C'est un autre processus; comment pourrais-je y aller? – JohnyTex

+1

La façon de faire est d'avoir un service. Lorsque la première activité commence à lier avec le service. Dans le service, créez un gestionnaire (le gestionnaire que vous utiliserez pour créer l'objet Messenger) qui contient un appel d'interface à la première activité de son handleMessage(). Sur la nouvelle activité qui commence dans un nouveau thread, liez avec le même service et appelez le gestionnaire en utilisant l'objet Messenger. Par conséquent, la communication se fera via un gestionnaire et les données seront transférées dans un objet Message. Si vous ne l'avez pas compris, répondez ici. –

Répondre

2

Fondamentalement, ce que vous demandez est sur ipc. Recherche le sur Google pour plus d'informations.

Pour ce faire, vous devez créer une classe Sevice et lier les deux activités.

Un exemple de classe de service ressemblerait à ceci.

public class MyService extends Service{ 
    //create a handler that will be used to handle messages 
    //this is just an example. Use static handlers 
    final Handler handler=new Handler(){ 
     public void handleMessage(Message msg){ 
      //I've just created a static feild.Check below. 
      MyFirstActivity.activity.seconActivityStarted(); 
     } 
    } 

    //create a Messenger object 
    Messenger messenger=new Messenger(handler); 

    @Override 
    public IBinder onBind(Intent intent){ 
     return messenger.getBinder() 
    } 
} 

Maintenant, les choses sont simples.

Vous devez maintenant lier la première activité avec le service.

public class MyFirstActivity extends AppCompatActivity{ 
    //for the time being I'll just create a static field that will be used. 
    //you can use an interface 
    static MyFirstActivity activity; 
    //create a ServiceConnection 
    ServiceConnection connection=new ServiceConnection(/*contents of the service connection */); 

    public void onStart(){ 
     super.onStart(); 
     activity=this; 
     bindService(new Intent(this,MyService.class),connection,Context.BIND_AUTO_CREATE)); 
    } 

    //following method will be called by the handler in the service 
    public void secondActivityStarted(){ 
     //some code 
    } 

    //you have to handle the activity lifecycle with the bound service. 
    //right now its described here 

} 

Maintenant, la deuxième activité

public class SecondActivity extends AppCompatActivity{ 
    //create a ServiceConnection 
    ServiceCOnnection serviceConnection=new ServiceConnection(){ 
     //call the handler at onServiceConnected 
     public void onServiceCOnnected(ComponentName name, IBinder service){ 
       Messenger messenger=new Messenger(service); 
       //compose a Message object as you like 
       messenger.send(new Message()); 
     } 
    }; 

    //bind this activity to the same service 
    public void onStart(){ 
     super.onStart(); 
     bindService(new Intent(this,com.package.name.MySerice.class),serviceConnection,Context.BIND_AUTO_CREATE); 
    } 
} 

Voilà. Modifiez cela selon les exigences.

P.S. Le code mentionné ci-dessus est juste structure de travail.

0

Si vous démarrez startActivity() sur une activité dans le même processus ou dans un autre (et en supposant que la deuxième activité démarre), l'activité appelante passera à l'état PAUSED, puis STOPPED. Ce qui signifie qu'aucun rappel ne sera traité. Cependant, vous pouvez appeler startActivityForResult() au lieu de startActivity() et recevoir le rappel onActivityResult().

+0

Oui, mais je dois arrêter l'activité commencée, n'est-ce pas? Je veux que ça continue. – JohnyTex

+1

Par conception Android SEULEMENT l'activité de premier plan est l'activité en cours, et les activités de fond sont automatiquement poussées à l'état Arrêté ou même détruites selon les besoins en ressources système. – Chebyr

+0

Je ne pense pas que vous pouvez garder la première activité en cours d'exécution –

0

Ajoutez une classe MyApplication qui étend Application et mention dans votre manifeste et y placez deux variables booléennes.

 private static boolean activityVisible; 

    public static void activityResumed() { 
    activityVisible = true; 
} 

public static void activityPaused() { 
    activityVisible = false; 
} 
public static boolean isActivityVisible() { 
    return activityVisible; 
} 

et maintenant vous pouvez utiliser appeler activityPaused() lorsque vous faites startActivity() sur OnPause() et onStop() de l'activité actuelle, et quand vous revenez à une même activité n'appelez activityResumed() dans surchargée Méthode onResume(). Maintenant, en utilisant MyApplication.isActivityVisible(), vous pouvez savoir si votre activité est en cours d'exécution ou en pause.