2017-05-02 12 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()); 
} 

}는

로그 캣 만 도시되어

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

감사합니다. Ryan. 내가 추가 한 후 : 매니페스트가 작동 중입니다. – Liviu

0

알람을 설정하려면 적어도 setWatchdogTimer()으로 전화해야합니다.

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.InstantiationException : 수신기 com.example.liviu.test_broadcastreceiver.WatchDog $ WatchDogReceiver를 인스턴스화 할 수 없습니다 : 인스턴스화 할 수 없습니다 클래스 com.example.liviu.test_broadcastreceiver.WatchDog $ WatchDogReceiver 당신에게 java.lang.RuntimeException가 감사 ; 빈 상태 (empty)의 생성자 없음 – Liviu