2011-12-20 19 views
0

私のonPause()でスレッドを停止しようとしていますが、スレッドはまだ実行され、スレッドが期限切れになったときに送信される通知を受け取ります。それは私がすべての権利を設定しているようだ...私のnotifcationはうまく動作し、8000睡眠後に現れます。しかし、ユーザーが/ onPause()を離れると、通知はまだポップアップします。スレッドはonPauseで停止しません

private static final int MY_NOTIFICATION_ID=1; 
    private NotificationManager notificationManager; 
    private Notification myNotification; 
Thread timer; 

protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.expire); 

     timer = new Thread(){ 
       public void run(){ 
        try{ 
         sleep(8000);      
        } catch (InterruptedException e){ 
         e.printStackTrace(); 
        }finally{ 
         NotificationManager notificationManager = 
           (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); 
           myNotification = new Notification(R.drawable.missedcall, 
           "Exired", 
           System.currentTimeMillis()); 
           Context context = getApplicationContext(); 
           String notificationTitle = "Time Expired"; 
           String notificationText = "Try next time"; 
           Intent myIntent = new Intent(); 
           PendingIntent pendingIntent 
           = PendingIntent.getActivity(CallScreen.this, 
            0, myIntent, 
            Intent.FLAG_ACTIVITY_NEW_TASK); 
           myNotification.defaults |= Notification.DEFAULT_SOUND; 
           myNotification.flags |= Notification.FLAG_AUTO_CANCEL; 
           myNotification.setLatestEventInfo(context, 
            notificationTitle, 
            notificationText, 
            pendingIntent); 
           notificationManager.notify(MY_NOTIFICATION_ID, myNotification); 
           finish(); 


        } 
       } 
      }; 
      timer.start(); 

} 


@Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     timer.stop(); 
     finish(); 
     } 

答えて

-1

私は、onPause()が実際に呼び出されたことをどのように知っていますか?

使用トーストやあなたのアプリはonPause()状態

0

まずに入ることを、見つけるためにログ:あなたは常に実行するfinally文でコードをしたいですか?書かれているように、通知を更新せずにスレッドを終了することはできないためです。

のthats okが、ちょうどそのあなたのfinallyブロックを呼び出して、あなたのInterruptedExceptionあるハンドラ&をトリガする、timer.interrupt()を呼び出す場合 - あなたがスレッドを中断を嫌うだとは本当にあなたが常に解放するラッチを使用することができ、あなたのスレッドにを取り付けたと感じた場合それ。

public class SomeDamnedActivity extends Activity { 
    // ... misc junk ... 
    private CountDownLatch mLatch; 
    private Thread mThread; 

    protected void onCreate(Bundle savedInstanceState) { 
     mLatch = new CountDownLatch(1); 
     mThread = new Thread() { 
      public void run() { 
       try { 
        mLatch.await(8, TimeUnit.SECONDS); 
       } catch (InterruptedException e) { 
        Log.w(TAG, "Interrupted waiting for latch to release", e); 
       } finally { 
        // Stuff goes here that you want to execute. 
       } 
      } 
     };  
    } 

    protected void onPause() { 
     // ... 
     mLatch.countDown(); // This will release the latch "prematurely" calling your finally-statement. 
    } 

は(FYI:AsyncTaskはおそらく良いアイデアであるかView#postDelayed(Runnable, long)を使用して、レイアウトのビューにRunnableの投稿)

+0

私は何をするつもりだと思う何をして、私はそれが動作することをテストした動きでありますnotepcationを 'sleep(8000);の中でtryに入れ、' onPause() 'の中で' timer.interrupt() 'を呼び出します。そうすれば8秒間実行すればnotifcationが出て、アクティビティは'finish()'を実行しても、ユーザーが8秒以内に新しいアクティビティを終了または開始すると、スレッドは 'onPause()'の 'timer.interrupt()'を呼び出し、期限切れの通知を見ません。 これは基本的に私が欲しいものです。あなたはそうしたやり方で何か問題を見ますか? – user961389

関連する問題