2016-06-22 13 views
1

私はstartメソッドを持つフレームワークをカプセル化したAndroidのサービスを持っています。サービスはこのような何かに帰着、多くのものが省略:アプリケーション起動時のサービスのバインドと起動

public class MyServiceBridge implements ServiceConnection { 

    private boolean started = false; 
    private boolean bound = false; 
    private MyService myService; 

    public MyServiceBridge(Context context){ 
     this.context = context; 
    } 

    public void bindService(){ 
     Intent intent = new Intent(getContext(), MyService.class); 

     getContext().bindService(intent, this, getContext().BIND_AUTO_CREATE); 
     getContext().startService(intent); 
    } 

    // Here's a sample call, and the one that is relevant 
    public void start(Map<String, Object> options){ 
     setOptions(options); 
     if(bound == true){ 
      getMyService().start(options); 
     } 
     else{ 
      started = true; 
     } 
    } 
} 

が、私は実行するために、ブリッジのstartメソッドを呼び出します。

public class MyService extends Service { 

    private IBinder thisBinder; 

    public MyService(){ 
     thisBinder = new LocalBinder(); 
    } 

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

    public void start(Map<String, Object> options) 
    { 
     getDriverManager().start(options); 
    } 
} 

は、私はまた、サービスへの呼び出しを行うブリッジクラスを持っていますサービス。この特定の状況(これまでのところ)を除いて、これはうまく動作します。 MyApplicationクラスはonCreate上でブリッジのstartメソッドを呼び出します。

public class MyApplication extends Application { 

    @Override 
    public void onCreate() { 

     super.onCreate(); 

     getServiceBridge().start(null); 
    } 
} 

これ、according to the docsは、「アプリケーションが作成されている(コンテンツプロバイダを除く)すべての活動、サービス、または受信機のオブジェクトの前に、起動したときに呼び出されます。」されます。実際には、サービスが開始されず、代わりにアプリケーションを終了すると(奇数、少なくとも)サービスが開始されるので、そうであるように見えます。これは、アクティビティのonCreateメソッドへの呼び出しを移動すると機能しますが、サービスを停止することができ、サービスがアプリの生涯にわたって実行されるため、これは理想的ではありません。つまり、アプリケーションの起動時にサービスが開始され、アプリケーションが終了すると停止する必要があります。これは理にかなっていますか?これを行う別の方法がありますか?

+0

'onCreate'メソッドは、Applicationクラスと呼ばれるのですか? –

+0

はい、メソッドが呼び出されます!しかし、これと@ vanste25の答えは、サービスがバックグラウンドで実行されていることと関係があるかもしれないことを認識させました。私は、このメソッドは、私がアプリケーションを実行する2回目に呼ばれるように見えないので、これを言う。 –

答えて

2

私の意見では、アプリケーションonCreateでサービスを実行することに決めたとき、あなたは良い仕事をしました。アプリを閉じるとそのサービスが開始されていると聞くのは不思議です。 私はこれを何回もやりましたが、呼び出さなければならないonCreateというアプリケーションでサービスが始まります。

アプリケーションが稼動していて、バックグラウンドで実行されているかどうかを確認しましたか?テストの前にあなたがあなたを殺したことを確認してください。タスクキラーなどを使用して、アプリケーションが常に新しく開始されることを確認します。

悲しいことに、Androidは、システムが終了してリソースを解放するまで、まだ生きているため、アプリケーションが終了したときに通知する適切なメカニズムがありません。

+0

私が見るので、そこでサービスが開始されていれば、サービス_do_は動作します。それは私がそれだったものを排除します。私は本当にアプリケーション(またはサービス)が終了したときにメソッドを使用することができます。このアプリは、(ルータなどの外部デバイスを使用する)ビットクリーンアップ依存です。サービスがそこで開始できることを知ったので、私はデバッグのためにもう少し時間を与えるでしょう。ありがとう! –

+0

あなたを歓迎します。 startServiceとbindServiceを順次呼び出すことに気をつけてください。 getContext()。bindService(intent、this、getContext()。BIND_AUTO_CREATE); getContext()。startService(インテント);多分あなたの問題があります。 – vanste25

+0

本当ですか?何故ですか? –

関連する問題