Receiver not registered

641 views
Skip to first unread message

takeshi honda

unread,
Feb 29, 2012, 9:36:18 PM2/29/12
to 日本Androidの会
Alarmを使って定期的にIntentServiceを呼び出し、GPSとバッテリ消費量をモニターするプログラムを作っています。
IntentServiceのonHandleIntentでバッテリをモニタするために、registerReceiverで
BroadcastReceiverを登録します。
またGPSをモニタするために、addNmeaListenerします。

そして、onNmeaReceivedでGPSが受信できた瞬間に、removeNmeaListenerとunregisterReceiverを呼
び出して、モニターを終了させようとしています。

しかし、動作が不安定で、onNmeaReceivedよりも先にIntentServiceのonDestroyが呼ばれると、以下の警告が出ま
す。

E/ActivityThread(13908): android.app.IntentReceiverLeaked: Service
jp.localhost.study.alarm.IService has leaked IntentReceiver
jp.localhost.study.alarm.IService$1@47a15608 that was originally
registered here. Are you missing a call to unregisterReceiver()?

これは無視しても問題ないのでしょうか?またこの警告を消すためにはどうしたらよいでしょうか?

また、onNmeaReceivedが何回も呼ばれるためか、以下のjava.lang.IllegalArgumentExceptionも出ま
す。

V/study (13908): Receiver not registered:
jp.localhost.study.alarm.IService$1@47a15608

現在は例外処理で無視しているのですが、それで問題ないのでしょうか?
できれば登録されている時だけunregisterReceiverを呼び出したいのですが、
あるBroadcastReceiverが登録されているかどうかを知る方法はありますでしょうか?

以下、コードを添付します。
よろしくお願いします。

-----------------------------------------------

public class AlarmAct extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Intent intent = new Intent(AlarmAct.this, Receiver.class);
PendingIntent sender =
PendingIntent.getBroadcast(AlarmAct.this, 0, intent, 0);
Intent intent2 = new Intent(AlarmAct.this, Receiver2.class);
PendingIntent sender2 =
PendingIntent.getBroadcast(AlarmAct.this, 0, intent2, 0);

// アラーム
AlarmManager alarmManager = (AlarmManager)
getSystemService(Context.ALARM_SERVICE);
int span = 1000;
long firstTime = SystemClock.elapsedRealtime();

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
firstTime+span, span, sender);
}
}

public class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.d("study", "onReceive:"+this);

Intent sintent = new Intent(context, IService.class);
context.startService(sintent);

Log.v("study","onReceive end"+this);
}
}

public class IService extends IntentService implements NmeaListener,
LocationListener{
Singleton sgl;
LocationManager gpsm;
public IService(){
super("IService");
}

@Override
protected void onHandleIntent(Intent intent) {
sgl = Singleton.getInstance();
Log.v("study","onHandle:"+sgl.cnt);

IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
Log.v("study","regist:"+sgl.cnt+" "+btry);
registerReceiver(btry, filter);

gpsm = (LocationManager) getSystemService(LOCATION_SERVICE);
gpsm.addNmeaListener(this);
LocationProvider p = gpsm.getProvider("gps");
gpsm.requestLocationUpdates(p.getName(), 0 ,0, this);

Log.v("study","onHandle end:"+sgl.cnt);
sgl.cnt++;
}

@Override
public void onDestroy() {
Log.v("study","destroy Iservice:"+sgl.cnt);
}

static private BroadcastReceiver btry = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
Log.v("study","battery changed");
}
}
};


@Override
public void onNmeaReceived(long timestamp, String nmea) {
Log.v("study","unregist:"+sgl.cnt+" "+btry);
try{
unregisterReceiver(btry);
}catch(Exception e){
Log.v("study",e.getMessage());
}
gpsm.removeUpdates(IService.this); // 位置リスナ解除
gpsm.removeNmeaListener(IService.this); // NMEAリスナ解除
}

@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub

}

@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle
extras) {
// TODO Auto-generated method stub

}
}

public class Singleton {
private static Singleton instance = new Singleton();
public int cnt = 0;

private Singleton(){
Log.v("study","new Singleton:"+this);
}

public static Singleton getInstance() {
return instance;
}
}
Reply all
Reply to author
Forward
0 new messages