0

画面が表示されたらいくつかの計算を行い、それらを表示し、画面が消えるとすべてのフィールドをクリアする単純なウィジェットがあります...私のサービスには、ACTION_SCREEN_ONとACTION_SCREEN_OFFをリッスンするブロードキャストレシーバーがセットアップされています。

これは、電話が長時間スリープ状態にならない限り、または電話の使用量が多い限り完全に機能します-これが発生すると、ウィジェットプロセスが強制終了されます(サービスはまだ実行されていますが、プロセスは強制終了されます)これは、ACTION_SCREEN_ON インテントがサービスによってキャッチされないため、画面が消えてウィジェットに戻ったときに更新されません:(

public class CDTservice extends Service {

  @Override
   public void onCreate() {


        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        m_receiver = new ScreenBroadcastReceiver();
        registerReceiver(m_receiver, filter);
        Log.d("Widgettool", "works");
    }



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


start();
Toast.makeText(getBaseContext(), "SERVICE ON", Toast.LENGTH_SHORT).show();

return START_REDELIVER_INTENT;
    }


     @Override
     public void onDestroy() {
 stop();
      unregisterReceiver(m_receiver);
      }



     public void start()
       { 
RemoteViews View = new RemoteViews(this.getPackageName(), R.layout.main);   
updatewidgetclass x= new updatewidgetclass(this, View, widgetId);
x.start(); // does calculations and displays on widget
     }


      public void stop()
   {   
RemoteViews Viewclear = new RemoteViews(this.getPackageName(), R.layout.main);

updatewidgetclass y = new updatewidgetclass(this, Viewclear, widgetId);
y.stop(); // clears resources and stops

}


   private class ScreenBroadcastReceiver extends BroadcastReceiver {

     @Override
    public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
        Log.d("ON SCREEN ON", "might hang here");   
        start();


     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
       stop();

    }
    }

    }

ウィジェットプロセスがAndroidシステムによって要求されていない場合、ウィジェットは数日間完全に機能し、ACTION_SCREEN_ONの値を完全に表示します

問題は次の場合に発生します-設定>アプリ>実行中を確認します-ウィジェット名が表示され、0プロセスと1サービスと表示されます

メインプロセスでブロードキャスト受信が発生しているため、プロセスが強制終了されたときに受信しないと想定しています。

これについては回避策がありますが、本当に問題を解決したいと考えています。どんな助けでも大歓迎です

4

1 に答える 1

0

画面のオンとオフを検出するためだけに、bgで常にサービスを実行することは非常に悪い考えであるという@CommonsWareに同意します。本当に が必要ですかACTION_SCREEN_ON、それともACTION_USER_PRESENT(電話のロックが解除されている) で十分ですか? この方法では、サービスはまったく必要なく、マニフェストでレシーバーを定義するだけで済みます。

本当にしたい場合は、サービス/ACTION_SCREEN_OFFレシーバーをレシーバーに登録ACTION_USER_PRESENTして、ユーザーが実際にデバイスを使用しているときにのみサービスが実行されるようにすることができます。

これがあなたの質問に実際に答えているわけではないことはわかっていますが、問題に対する有用な回避策を提供します。

于 2013-05-23T13:04:34.130 に答える