2017-05-02 1 views
-1

私は内部クラスのブロードキャスト受信機を使用してウォッチドッグ機能を作ろうとしています。親クラスでコンストラクタ内にブロードキャストレシーバを登録しましたが、onReceiveクラスは決してトリガされません。BroadcastReceiver内部クラスはトリガーされません

どうすればこの問題を解決できますか?ありがとうございました。

ウォッチドッグ・クラス:

public class WatchDog { 
private final String TAG = getClass().getSimpleName(); 
private static final String RECEIVER_WATCHDOG = "com.example.liviu.test_broadcastreceiver.receiver"; 
private final static String ACTION_WATCHDOG = "com.example.liviu.test_broadcastreceiver.action.watchdog"; 
private final static int ID_WATCHDOG = 40856342; 
private final static int mTimeout = 1000; 

public WatchDog (Context context) { 
    Log.d(TAG, ":::::::::::: Watchdog CONSTRUCTOR"); 
    IntentFilter intentFilter = new IntentFilter(RECEIVER_WATCHDOG); 
    BroadcastReceiver receiver = new WatchDogReceiver(); 
    context.registerReceiver(receiver, intentFilter); 
    setWatchdogTimer(context, true, mTimeout); 
} 

final class WatchDogReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(TAG, ":::::::::::: Watchdog received - "); 
     setWatchdogTimer(context, true, mTimeout); 
    } 
} 

public void setWatchdogTimer(Context context, boolean set, int timeout) { 
    Log.d(TAG, ":::::::::::: Watchdog START"); 
    Intent intent = new Intent(context, WatchDogReceiver.class); 
    intent.setAction(ACTION_WATCHDOG); 
    PendingIntent alarmIntent = PendingIntent.getBroadcast(context, ID_WATCHDOG, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    if (set) { 
     alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + timeout, alarmIntent); 
    } else { 
     alarmManager.cancel(alarmIntent); 
    } 
} 

}

とMainActivityクラス:

public class MainActivity extends AppCompatActivity { 
private final String TAG = getClass().getSimpleName(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Log.d(TAG, ">>>>>>>>>>>> Activity START"); 
    new WatchDog(getApplicationContext()); 
} 

は}

Logcatのみ表示されている:

05-02 18:11:10.197 20415-20415/com.example.liviu.test_broadcastreceiver D/MainActivity: >>>>>>>>>>>> Activity START 
05-02 18:11:10.197 20415-20415/com.example.liviu.test_broadcastreceiver D/WatchDog: :::::::::::: Watchdog CONSTRUCTOR 
+0

あなたの受信機は公開されていません。あなたのマニフェストに受信機があることを確認します。 –

+0

放送を受信者にどのくらい正確に送信していますか?あなたが現在質問にあるコードから、それは受信者に何かを送るようには見えないので、それらのログは私が知る限り予想される結果です。 –

+0

繰り返しアラームを設定しようとしていますか? –

答えて

0

動的登録/登録解除をしたい場合は、onResumeに登録してonPause()を登録解除してください。静的に行う場合は、それをマニフェストに登録し、ネストしたクラスを静的にして、マニフェストでインスタンス化できるようにします。

0

受信者がマニフェストに登録されていますか?それが必要です。

<receiver 
android:name=".receivers.WatchDog$WatchDogReceiver"/> 
+1

これは当てはまりません。実行時に 'registerReceiver()'を使って受信機を登録する場合、マニフェストで何もする必要はありません。 –

+0

ありがとうございました。私が追加した後、マニフェストのが動作しています。 – Liviu

0

アラームを設定するには、少なくともsetWatchdogTimer()に電話する必要があります。 BroadcastReceiverアプリにローカルになる場合

public class MainActivity extends AppCompatActivity { 
private final String TAG = getClass().getSimpleName(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Log.d(TAG, ">>>>>>>>>>>> Activity START"); 
    WatchDog watchDog = new WatchDog(getApplicationContext()); 
    watchdog.setWatchdogTimer(this, true, 1000); 
} 

LocalBroadcastReceiverを使用することを検討してください。

+0

このようにしてsetWatchdogTimerを呼び出すと:watchDog.setWatchdogTimer(this、true、1000);このメッセージの最後にエラーが表示されました WatchDogReceiverクラスとsetWatchdogTimer(...)メソッドを静的に変更すると、ソリューションも動作します。 WatchDog.setWatchdogTimer(this、true、1000); はあなたに java.lang.RuntimeExceptionありがとう:受信機com.example.liviu.test_broadcastreceiver.WatchDog $ WatchDogReceiverをインスタンス化できません:java.lang.InstantiationExceptionの:クラスをインスタンス化することはできませんcom.example.liviu.test_broadcastreceiver.WatchDog $ WatchDogReceiverを;空のコンストラクタはありません – Liviu

関連する問題