takeshi honda
unread,Feb 29, 2012, 9:36:18 PM2/29/12Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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;
}
}