2010-09-10 6 views
1

Je dois faire une activité (sans mise en page) qui, au démarrage, vérifie si un service est en cours d'exécution. si c'est vrai, il démarre Activity2, s'il est faux, il démarre Activity1. J'ai essayé avec ce code:Service de vérification d'activité Android pour démarrer une autre activité

public class FirstActivity extends Activity{ 

    private final Intent serviceIntent = new Intent(ServiceConnected.class 
        .getName()); 

    private ServiceConnected serviceConnected; 

    private final ServiceConnection serviceConnection = new ServiceConnection() { 

      @Override 
      public void onServiceConnected(ComponentName name, IBinder service) { 


        serviceConnected = ServiceConnected.Stub.asInterface(service); 
        Log.e("Connessione al Servizio", "onServiceConnected"); 
        Toast.makeText(FirstActivity.this, "Connessione con il Service Effettuata", Toast.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void onServiceDisconnected(ComponentName name) { 
        Log.e("Disconnessione dal servizio", "onServiceDisconnected"); 
        Toast.makeText(FirstActivity.this, "Scollegamento effettuato", Toast.LENGTH_SHORT).show(); 
      } 

    }; 


    @Override 
    public void onCreate(Bundle savedInstanceState){ 
      setContentView(R.layout.firstactivity); 
      super.onCreate(savedInstanceState); 
      bindRemoteService(); 
      Log.e("Dopo Bind onCreate","FirstActivity"); 
      if(serviceConnected!=null) 
        try { 
          boolean temp=serviceConnected.getConnected(); 
          Log.e("ServiceConnected",Boolean.toString(temp)); 
          if(temp==true){ 
            Log.e("Salto alla seconda","FirstActivity"); 
            step2(); 
          } 
          else{ 
            Log.e("Salto alla prima","FirstActivity"); 
            step1(); 

          } 

        } catch (RemoteException e) { 
          // TODO Auto-generated catch block 
          Log.e("Errore Step","FirstActivity"); 
        } 

    } 




    public void bindRemoteService() { 
      if (serviceConnected == null) { 
        if(bindService(serviceIntent, serviceConnection, 
            Context.BIND_AUTO_CREATE)){ 

          Log.e("Bind Effettuato", "bindRemoteService"); 
          Toast.makeText(this, "Service Binded", Toast.LENGTH_SHORT).show(); 

        } 
      } 
    } 


    private void step2(){ 

      Intent intent; 
      intent=new Intent(getApplicationContext(), Activity2.class); 
      startActivity(intent); 

    } 

    private void step1(){ 

      Intent intent; 
      intent=new Intent(getApplicationContext(), Activity1.class); 
      startActivity(intent); 

    } 


enter code here 

mais quand je vérifie, dans la méthode onCreate, si serviceConnect = null Je reçois parfois un NullPointerExcption!.

J'ai aussi essayé d'insérer l'opération dans la méthode onCreate dans un Async Tâche:

private class BackgroundWorker extends AsyncTask<Void,Integer, Void> { 




    @SuppressWarnings("unchecked") 
    @Override 
    protected void onPreExecute() { 

     Log.e("BackgroundWorker","onPreExecute"); 
     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground (Void... params) { 

     Log.e("Dentro Background Worker", "DOIN"); 


     bindRemoteService(); 
     publishProgress(1); 
     //publishProgress(2); 




     return null; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    protected void onProgressUpdate (Integer... values) { 


     try{  

      do{ 

       try { 

        if (serviceConnected!=null&&checked==true){ 

         boolean temp=serviceConnected.getConnected(); 

         if(temp==true){ 
          Log.e("Salto alla seconda","FirstActivity"); 
          Log.e("ServiceConnected",Boolean.toString(temp)); 
          step2(); 
         } 

         else if(temp==false){ 
          Log.e("Salto alla prima","FirstActivity"); 
          Log.e("ServiceConnected",Boolean.toString(temp)); 
          step1(); 

         } 
        } 

       } catch (RemoteException e) { 
        // TODO Auto-generated catch block 
        Log.e("Errore Step",e.toString()); 
       } 

      }while(checked==false); 


     }catch(Exception e){Log.e("Errore do",e.toString());}; 


    } 
} 

Mais j'ai le même problème. Quelqu'un sait comment je peux résoudre ce problème? Merci

Répondre

1

bindService() est asynchrone. Vous devez attendre jusqu'à ce que onServiceConnected() soit appelé sur votre ServiceConnection avant de savoir si le service est prêt à l'emploi.

+0

Merci pour votre réponse. Je sais cela, mais je ne sais pas comment attendre – zerocool87

+0

@ zerocool87: Vous déplacez tout votre code après votre appel à 'bindService()' depuis 'onCreate()' et dans 'onServiceConnected()'. Vous ne regardez pas 'serviceConnected' jusqu'à' onServiceConnected() '. Franchement, je pense que vous avez besoin d'une approche différente du problème, fusionnant probablement Activity1 et Activity2 en une seule activité, vous n'avez donc pas à prendre cette décision. – CommonsWare

1

@CommonsWare Je ne peux pas fusionner Activity1 et Activity2 car elles sont structurées différemment. J'ai résolu de démarrer un autre thread qui vérifie si la liaison a fait. Merci pour votre réponse

Questions connexes