2016-08-11 9 views
0

の変数へのアクセス:私はAndroidの活動は、次のようにMainServiceと呼ばれるサービスを呼び出すメインと呼ばれる持っているサービス

Intent intent = new Intent(this, MainService.class); 
if(MainService.getInstance() == null){ 
    Log.d(TAG, "Calling MainService"); 
    startService(intent); 
} 

MainServiceは私が後でメインにアクセスしたいその寿命の間に変数を維持します。これはどうすればいいですか?

ありがとうございました。

+0

アクティビティとサービスの間で通信するためにバインドサービスを使用しないのはなぜですか?私はこれがあなたにデータを共有するためにもっと柔軟になると思います。 –

答えて

0

はい、サービス内の変数にアクセスできますが、そのためにはまずこのサービスにバインドする必要があります。その後、変数を取得または設定するためのアクセサを使用するか、サービスの他のメソッドを呼び出します。 参照https://developer.android.com/guide/components/bound-services.html

+0

ありがとうございます。私はコードをいくつか変更しました。つまり、onStart()ではなくonCreateでbindService()を呼び出し、サービスを永久に実行したいのでサービスをアンバインドしないようにしました。私のbindService()呼び出しで "Activity has ServiceConnection"エラーが発生し続けることを除いて、動作します。また、アクティビティに戻るたびに、ServiceConnectionが再び呼び出されたようです。これは1回、正しいでしょうか?それは、startService()ではなくbindService()を使うことと関係がありますか? – user1118764

+0

これで、アクティビティにバインドされているサービスは、アクティビティが生きているとき、つまりアクティビティのライフサイクルに従っているときにのみ生きていることに気付きました。だから、私はstartService()を使ってアクティビティからサービスを開始し、その後、そのサービスをアクティビティにバインドして、今すぐ動作します。 – user1118764

2

サービスをバインドすることができ、サービスインスタンスを永久に持つことができます。サンプルコードの下にはあなたを助ける: -
サービスあなたはその後、どこでもあなたが活動に必要なserviceを使用することができ、クラス

public class MusicService extends Service { 

    MyBinder binder=new MyBinder(); 
    MusicService services; 
    static Context context; 
    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return binder; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     context=getApplicationContext(); 

     MediaPlayer mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.yaar); 
     mPlayer.start(); 
    } 

    public class MyBinder extends Binder 
    { 
     public MusicService getServiceSystem() 
     { 
      return MusicService.this; 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 
} 

活動

public class MainActivity extends AppCompatActivity { 

    MusicService services; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ServiceConnection connection=new ServiceConnection() { 
      @Override 
      public void onServiceConnected(ComponentName name, IBinder service) { 
       MusicService.MyBinder binderr=(MusicService.MyBinder)service; 
       services=binderr.getServiceSystem(); 
      } 

      @Override 
      public void onServiceDisconnected(ComponentName name) { 

      } 
     }; 

     Intent intent= new Intent(this, MusicService.class); 
     startService(intent); 
    } 

} 

。それが役に立てば幸い。

+0

ありがとうございます。私はこれを試しましたが、onServiceConnected()は呼び出されませんでしたか?したがって、サービスはnullで使用できません。 – user1118764

+0

@ user1118764あなたがマニフェストで宣言したことを確認しますか? –

関連する問題