2016-09-06 6 views
1

バインドされたサービスを持つシングルトンオブジェクトがありました。私はそれを再起動したいと思います。ランチャーからアプリケーションを起動すると、シングルトンオブジェクトが初期化され、この既存のサービスインスタンスにバインドされます。ここで固定オブジェクトがカスタムオブジェクトで作成されたときに再起動しない

はシングルトンでサービスを作成し、結合するためのコードです:

public class MyState { 

    private static MyState sState; 

    private MyService mService; 
    private Context mContext; 
    private boolean mBound = false; 


    private ServiceConnection mConnection = new ServiceConnection() { 
     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      MyService.MyBinder binder = (MyService.MyBinder) service; 
      mService = binder.getService(); 
      mBound = true; 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName name) { 
      mBound = false; 
     } 
    }; 

    public static MyState get(Context context) { 
     if (sState == null) { 
      sState = new MyState(context); 
     } 
     return sState; 
    } 

    public MyState(Context context) { 
     mContext = context.getApplicationContext(); 
     startService(); 
    } 

    private void startService() { 
     Intent intent = new Intent(mContext, MyService.class); 
     mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 
     // this won't create another instance of service, but will call onStartCommand 
     mContext.startService(intent); 
    } 
} 

そして、ここでは、私は、タスクリストでこのサービスを私のアプリをスワイプサービス

残念ながら
public class MyService extends Service { 

    private final IBinder mBinder = new MyBinder(); 

    public class MyBinder extends Binder { 
     MyService getService() { 
      return MyService.this; 
     } 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return mBinder; 
    } 

    // this method is called by singleton object to stop service manually by user                            
    public void stop() { 
     stopSelf(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     // some cleanup code here                                        
    } 
} 

、insiceコードです決して再起動しない。この場合、サービスのonDestroyメソッドは呼び出されません。

ユーザーがサービスとやりとりできるアクティビティにバインドを移動したところ、期待通りに動作し始めました。 私の活動の中でアプリケーションのコンテキストを使ってサービスの作成を呼び出そうとしましたが、それでも動作します。

通常のJavaオブジェクトから起動するサービスとは異なるアクティビティからサービスを開始していますか?

答えて

1

あなたがSTART_STICKYを返却されるとアプリケーションが閉じられた後、すべてのリファレンス/ Valueはすべてテント用nullだけでなく、変数とそのSTICKYサービスがテントを得ることができないだろうとなりますので、あなたが近い/アプリを殺すたびに、このサービスが停止します値。アプリはreturn START_REDELIVER_INTENT

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return START_REDELIVER_INTENT; 
} 

使用殺した後にサービスを再起動したい場合はアプリが殺された後、これを5〜10秒でサービスを再起動します。

+0

私はそれを試してみます。しかし、なぜ私はそれをアクティビティで起動したときにサービスが適切に再開しますか? – nevermourn

+0

アプリケーションが実行されているときに、すべての参照と値がそこにありますが、アプリケーションが終了した後にすべての値がnullになるため、サービスが正しく再起動されます –

+0

実際には私はちょっとばかげていました。 javadocはSTART_STICKYについて語ります。 まだ、アクティビティ内と外で動作が異なる理由はわかりません。 活動中のときは、onDestroyが呼び出されますが、その外にはありません。 – nevermourn

関連する問題