0

画面に赤い四角形を配置し、次のような onDestroy() を持つサービスがあります

@Override
    public void onDestroy() {

      Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show(); 
}

私の活動の1つから、このサービスを次のように強制終了するために呼び出しています:

 stopService(new Intent(this, assNavOverrideService.class));

onDestroy() が呼び出されたことを示すトーストが表示されますが、まだ赤い四角形が表示され、まだ実行中です..

私のマニフェストは使用しています:

<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" >

マイサービス

public class assNavOverrideService extends Service {

    Timer timer;
    WindowManager.LayoutParams handleParams;

    View screenBlock;
    View disableStatusBar;
    WindowManager winMgr;
    @Override
    public void onCreate() {

        winMgr = (WindowManager)getSystemService(WINDOW_SERVICE); 
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        disableStatusBar = new TableLayout(getApplicationContext());
        handleParams = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.FILL_PARENT,
                50, 
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                 // this is to keep button presses going to the background window
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
                 // this is to enable the notification to recieve touch events
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
                 // Draws over status bar
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                PixelFormat.TRANSPARENT);

         handleParams.gravity = Gravity.TOP;
         handleParams.y = 750;

         disableStatusBar.setBackgroundResource(R.drawable.fake_nav);

         winMgr.addView(disableStatusBar, handleParams);

         timer = new Timer();
         uiCheckTask tTask = new uiCheckTask();
         tTask.setService(this);
         timer.schedule(tTask, 50, 10);

        // If we get killed, after returning from here, restart
         return START_REDELIVER_INTENT;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // We don't provide binding, so return null
        return null;
    }

    @Override
    public void onDestroy() {

      Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show(); 
    }



    class uiCheckTask extends TimerTask {
        Boolean secDialog = false;
        assNavOverrideService myService;


       public void setService(assNavOverrideService mS){
           myService = mS;
       }


        public void run() {

                Log.v("TICK","TOCKKKKKKKKKKK");


        }



    }



}
4

2 に答える 2

0

まず、作成したサービスを停止するためにその権限を持っている必要はありません。私はサービスを頻繁に (開始および停止して) 使用していますが、その許可を使用したことは一度もありません。

すなわち:

Intent service = new Intent(myContext,Service.class);
    
    
    startService(service);
    
    
    stopService(service);

は、あなたが必要とすることすべてです。

もちろん、Android マニフェストでサービスを宣言する必要があります。

これで、アクティビティに影響するものはすべて、そのアクティビティ内のコンテキストを使用します。したがって、サービスを終了しても UI の内容は変わりません。Destroy のサービスでは、なんらかの方法で矩形オブジェクトを参照し、その方法で削除する必要があります。

長方形をどのように作成したかわかりません。ただし、ビューの場合は VISIBILITY.GONE に設定できます。ViewStub の場合はデフレートでき、オブジェクトの場合はクリアできます。

サービス停止関数を呼び出した後でもサービスがまだ実行されていると言っている場合は、何か他の問題があります。サービスを正しく停止しているように見えますが。

- - - - - - - - - - - - - - - 編集 - - - - - - - - - - -------------------------------------------------- ------------------------------------ あなたのサービスもあなたの活動に結びついているかもしれません。これを行っている場合は、バインディングを解放する必要があります。

同様の質問へのリンクは次のとおりです。

これがお役に立てば幸いです。乾杯

于 2012-10-25T01:25:02.900 に答える
0

私のサービスではonDestroy()、タイマータスクを停止する必要があり、サービスは終了しました...

于 2012-10-26T14:31:44.383 に答える