76

組み込みのSMSアプリに似たアプリを作成中です。

必要なもの:

  • 常にバックグラウンドで実行されているサービス
  • 5分ごと。サービスはデバイスの現在の場所を確認し、Webサービスを呼び出します
  • 特定の基準が満たされている場合、サービスは通知を生成する必要があります(SMSアプリと同様)
  • 通知をクリックすると、ユーザーはアプリに移動します(SMSアプリと同じように)
  • アプリがインストールされたら、サービスを開始する必要があります
  • デバイスを再起動したら、サービスを開始する必要があります

私が試したこと: -Android
がサービスを強制終了するまで正常に機能する通常のサービスを実行する
-AlarmManagerを使用して5分を作成します。サービスへのインターバル呼び出し。しかし、私はこの仕事をすることができませんでした。

4

5 に答える 5

35

常にバックグラウンドで実行されているサービス

あなたが発見したように、これは用語の本当の意味では不可能です。それも悪いデザインです。

5分ごと。サービスはデバイスの現在の位置を確認し、Web サービスを呼び出します

を使用しAlarmManagerます。

AlarmManager を使用して 5 分にします。サービスへのインターバル呼び出し。しかし、私はこれを機能させることができませんでした。

これを使用する方法を示すサンプル プロジェクトを次に示しますWakefulIntentService。これにより、Web サービス全体を実行しようとしている間も目を覚まし続けることができます。

それでも問題が解決しない場合は、あなたが直面しAlarmManagerている特定のことについて、新しい質問をしてください。

于 2010-04-02T12:15:29.450 に答える
26

私のアプリの 1 つは、非常に似たようなことを行います。一定期間後にサービスを起動するには、お勧めしますpostDelayed()

ハンドラー フィールドを用意します。

private final Handler handler = new Handler();

そして復習Runnable

private final Runnable refresher = new Runnable() {
  public void run() {
    // some action
  }
};

ランナブルで通知を起動できます。

サービスの構築時、および各実行後に次のように開始します。

handler.postDelayed(refresher, /* some delay in ms*/);

投稿onDestroy()を削除する

handler.removeCallbacks(refresher);

ブート時にサービスを開始するには、自動スターターが必要です。これはあなたのマニフェストに入ります

<receiver android:name="com.example.ServiceAutoStarter">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
  </receiver>

ServiceAutoStarter次のようになります。

public class ServiceAutoStarter extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    context.startService(new Intent(context, UpdateService.class));
  }
}

OS がサービスを強制終了するのを止めるのは難しい作業です。また、アプリケーションがRuntimeExceptionクラッシュしたり、ロジックが停止したりする可能性があります。

私の場合、画面上のサービスをBroadcastReceiver. そのため、更新のチェーンが停止した場合、ユーザーが電話を使用すると復活します。

サービス内:

private BroadcastReceiver screenOnReceiver; 

あなたのサービスでonCreate()

screenOnReceiver = new BroadcastReceiver() {

  @Override
  public void onReceive(Context context, Intent intent) {
    // Some action
  }
};

registerReceiver(screenOnReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON));

次に、サービスの登録を解除しonDestroy()ます

unregisterReceiver(screenOnReceiver);
于 2010-04-02T11:44:23.070 に答える