私の経験から、電話や GPS などは、 でIntents
聞くことができる放送をしますBroadcastReceiver
。デバイスは、それらをブロードキャストするのに十分な時間、起動しています。
(技術的には、Android ファームウェアはデバイスの電力レベルを処理し、特定の機能にウェイクロックを提供します。これにより、ハードウェア信号によってコードの実行が許可されるように見えますが、実際にはハードウェア信号によって Android の実行が許可され、コードの実行が許可されます。 .)
BroadcastReceiver
したがって、これらのインテントに登録すると、サブクラス内で通知されます。デバイスは、受信機内で短時間起動します。これは、制御して独自の を作成するのに十分な時間ですWakeLock
。
そう:
デバイスには、あなたが求めている機能があります-具体的には、完全にハードウェアではなく、Android ファームウェアによって制御されます。これは、ファームウェアのリリースが異なれば、動作が異なる可能性があることを意味します。これは、さまざまなデバイスの GPS 追跡アプリでデバッグ ログ出力を監視している場合 (ファームウェア GPS がどのように使用されているかを監視している場合) に非常に明白です。
をフックすることができIntent
、独自の を実装する時間がありますWakeLock
。
@CommonswareのWakefulIntentServiceをチェックして、それを利用します。
そうでなければ、彼はそれについての非常に良い情報を彼の本に書いています.
BroadcastReceiver
からの更新をリッスンするために使用する例LocationProvider
これは製品コードを改変したサンプル コードです。一部を削除しましたが、特別なコードがなくてもこのレシーバーが動作することを示すために残しています。
/**
* Receives broadcasts from the {@link LocationProvider}s. The providers
* hold a {@link PowerManager.WakeLock} while this code executes. The
* {@link MyService} code needs to also hold a WakeLock for code that
* is executed outside of this BroadcastReceiver.
*/
private BroadcastReceiver locationEventReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
// get location info
Bundle extras = intent.getExtras();
if (extras != null)
{
Log.d("mobiRic", "LOCATION RECEIVER CALLBACK");
// check if this is a new location
Location location = (Location) extras
.get(android.location.LocationManager.KEY_LOCATION_CHANGED);
Log.d("mobiRic", " - intent = [" + intent + "]");
Log.d("mobiRic", " - location = [" + location + "]");
if (location != null)
{
updateCurrentLocation(location, false);
}
}
}
};
BroadcastReceiver
GPS イベントを取得するための設定方法の例
Service
場所イベントを確実に取得するために使用する 2 つの (編集済み) メソッドを次に示します。
/**
* Starts listening for {@link LocationManager#GPS_PROVIDER} location
* updates.
*/
void doStartLocationListeningGps()
{
Intent intent = new Intent("MY_INTENT_GPS");
PendingIntent pendingIntentGps = PendingIntent.getBroadcast(getApplicationContext(),
action.hashCode(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
getLocationManager().requestLocationUpdates(LocationManager.GPS_PROVIDER,
LOCATION_UPDATE_TIME_GPS, 0, pendingIntentGps);
}
/**
* Registers the {@link #locationEventReceiver} to receive location events.
*/
void registerLocationReceiver()
{
IntentFilter filter = new IntentFilter();
/* CUSTOM INTENTS */
filter.addAction("MY_INTENT_GPS");
registerReceiver(locationEventReceiver, filter);
}