2017-12-14 10 views
0

私はまったくわからないと思うが、主なアクティビティがユーザのアクションやアンドロイドシステムによって破壊されてもサービスが持続するようにしたいと思う。アプリがある時点で再開されたら、bgアクティビティが存在するかどうかを確認し、アクションボタン、THXを使用して事前に停止したいと思うでしょう。アプリが実行中のアプリ一覧から閉じているときMainActivityが閉じられた後にサービスを停止する(EDITED)


私は、私はそれを停止し、それを再実行することができ、私のMainActivityにバックグラウンドサービスを開始し、サービスが解消されない私は、閉じたアプリケーションを再起動したときに、問題があるANにしてみてくださいボタンを使ってサービスを停止する私は、アプリケーションがクラッシュしても、もはや参照がないサービスを停止しようとするため、クラッシュすることがあります。 BgServiceIntentは、もはやこのサービスを指すので、私はこれを得るためのアプリを再開した後stopBg()を呼び出す

private void startBg(){ 

    if (!hasPermissions() || mScanning) { 
     return; 
    } 

    clearLogs(); 

    BgServiceIntent = new Intent(MainActivity.this, BgScanService.class); 
    startService(BgServiceIntent); 
} 
private void stopBg(){ 
    stopService(BgServiceIntent); 
} 

は、失敗しない:

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: mobile.link.imbera.apsys.imberalink, PID: 20104 
       java.lang.NullPointerException 
        at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1568) 
        at android.app.ContextImpl.stopServiceCommon(ContextImpl.java:1628) 
        at android.app.ContextImpl.stopService(ContextImpl.java:1589) 
        at android.content.ContextWrapper.stopService(ContextWrapper.java:499) 
        at mobile.link.imbera.apsys.imberalink.MainActivity.stopBg(MainActivity.java:180) 
        at mobile.link.imbera.apsys.imberalink.MainActivity.lambda$onCreate$1$MainActivity(MainActivity.java:124) 
        at mobile.link.imbera.apsys.imberalink.MainActivity$$Lambda$1.onClick(Unknown Source) 
        at android.view.View.performClick(View.java:4463) 
        at android.view.View$PerformClick.run(View.java:18770) 
        at android.os.Handler.handleCallback(Handler.java:808) 
        at android.os.Handler.dispatchMessage(Handler.java:103) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:5333) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:515) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 
        at dalvik.system.NativeStart.main(Native Method) 
+0

でこれを追加)します開始し、サービスを停止する –

答えて

1

サービスは、すでにあなたが呼び出す必要があり、その後、バックグラウンドで実行されている場合はstopSelf()は、そのサービスの同じインスタンス上にあります。 サービスライフサイクルごとに今すぐonCreate()は、サービスの有効期間内に一度だけ呼び出します。 WhereAs onStartCommand新しいインテントでstartService()を呼び出すたびに呼び出されます。それで、あなたができることは、それを止める意図で旗を渡すことです。

Intent BgServiceIntent = new Intent(MainActivity.this, BgScanService.class); 
    BgServiceIntent.putExtra("close",true); 
    startService(BgServiceIntent); 

とサービス中です。まず

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    boolean shouldClose=intent.getBooleanExtra("close",false); 
    if(shouldClose){ 
     stopSelf(); 
    } else { 
     // Continue to action here 
    } 
    return START_STICKY; 
} 
0

をたぶんあなたはそれが前にnullをだかどうかを確認するだけですそれを停止しようとする:

private void stopBg(){ 
    if(BgServiceIntent != null) 
     stopService(BgServiceIntent); 
} 
+0

私はalaways主力が破壊されたため、私が欲しいのは、実行中のインスタンスまたはそのstartIdまたは後でそれを殺すために何かを取得する方法が原因であると思う。 – Larvex

0

はSTART_NOT_STICKYにサービスを開始します。
オーバーライドあなたのサービス

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

で、この方法とMainActivityの@オーバーライド 保護のボイドonResume()を使用しますと、ボイドonPause(保護された@オーバーライド あなたMainActivity.class

@override 
private onDestroy() { 
    stopService(YourActiveService); 
    finishAffinity(); 
    super.onDestroy() 
} 
+0

私はそれが粘着性であることを望みます、それはBGサービスであることのポイントです、私はそれがメインアプリケーションが死ぬ場合でも持続したいですが、私は以前のclsed主な活動を再開し、ポイント – Larvex

関連する問題