33

私は、その場所に関する情報をリモートサーバーに中継するアプリに取り組んでいます。私は単純な HTTP ポストを Web サーバーに送信することでそれを行うつもりであり、すべてが単純で問題ありません。

しかし、仕様によると、アプリは時々、たとえば 30 分に 1 回、自分自身を実行する必要があります。インターフェイスから独立していること。つまり、アプリが閉じられていても実行する必要があることを意味します。

周りを見回したところ、Android Services を使用する必要があることがわかりました。そのようなシステムを実装するために何を使用できますか。電話機の再起動時に、サービス (ま​​たはその他のメカニズム) は再起動しますか?

前もって感謝します。

4

4 に答える 4

33

Serviceサーバーに情報を送信する を作成します。おそらく、あなたはそれを制御しています。

によってトリガーServiceされるアラームによって開始する必要がAlarmManagerあります。間隔を指定できます。正確に 30 分ごとにデータを報告する必要がない限り、バッテリー寿命をいくらか節約できるように、おそらく不正確なアラームが必要になるでしょう。

BroadcastReceiver最後に、次のように設定することで、アプリを登録して起動ブロードキャストを取得できます。

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {  
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            // Register your reporting alarms here.            
        }
    }
}

これを機能させるには、次の権限をあなたに追加する必要がありますAndroidManifest.xml。アプリを通常どおり実行するときにアラームを登録することを忘れないでください。そうしないと、デバイスの起動時にのみ登録されます。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
于 2012-05-02T20:07:44.610 に答える
19

これは、サービスを永続的に維持するための半異なる方法です。必要に応じて、コードでそれを殺す方法があります

バックグラウンド サービス:

package com.ex.ample;

import android.app.Service;
import android.content.*;
import android.os.*;
import android.widget.Toast;

public class BackgroundService extends Service {

    public Context context = this;
    public Handler handler = null;
    public static Runnable runnable = null;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        Toast.makeText(this, "Service created!", Toast.LENGTH_LONG).show();

        handler = new Handler();
        runnable = new Runnable() {
            public void run() {
                Toast.makeText(context, "Service is still running", Toast.LENGTH_LONG).show();
                handler.postDelayed(runnable, 10000);
            }
        };

        handler.postDelayed(runnable, 15000);
    }

    @Override
    public void onDestroy() {
        /* IF YOU WANT THIS SERVICE KILLED WITH THE APP THEN UNCOMMENT THE FOLLOWING LINE */
        //handler.removeCallbacks(runnable);
        Toast.makeText(this, "Service stopped", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onStart(Intent intent, int startid) {
        Toast.makeText(this, "Service started by user.", Toast.LENGTH_LONG).show();
    }
}

主なアクティビティから、または任意の場所から開始する方法は次のとおりです。

startService(new Intent(this, BackgroundService.class));

onDestroy()アプリケーションが閉じられるか強制終了されたときに呼び出されますが、ランナブルはすぐに再開します。

これが誰かを助けることを願っています。

一部の人々がこれを行う理由は、場合によってはユーザー/従業員が特定のものを停止できてはならない企業アプリケーションのためです:)

http://i.imgur.com/1vCnYJW.png


編集

Android O (8.0) 以降JobManager、スケジュールされたタスクに使用する必要があります。Evernote の Android-Jobというライブラリがあり、すべての Android バージョンで定期的なバックグラウンド作業を簡単に行うことができます。このライブラリのXamarin Bindingも作成しました。

次に、次のことを行う必要があります。

あなたのアプリケーションクラスで:

public class MyApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        JobManager.create(this).addJobCreator(new MyJobCreator());
    }
}

次の 2 つのクラスYourJobCreatorを作成しますYourSyncJob(すべての作業が行われる場所。Android はすべてのバックグラウンド ジョブを実行する時間を割り当てます。Android バージョン < 8.0 の場合、通常どおりアラーム マネージャーとバックグラウンド サービスで実行されます)

public class MyJobCreator implements JobCreator {

    @Override
    @Nullable
    public Job create(@NonNull String tag) {
        switch (tag) {
            case MySyncJob.TAG:
                return new MySyncJob();
            default:
                return null;
        }
    }
}

public class MySyncJob extends Job {

    public static final String TAG = "my_job_tag";

    @Override
    @NonNull
    protected Result onRunJob(Params params) {
        //
        // run your job here
        //
        //
        return Result.SUCCESS;
    }

    public static void scheduleJob() {
        new JobRequest.Builder(MySyncJob.TAG)
                .setExecutionWindow(30_000L, 40_000L) //Every 30 seconds for 40 seconds
                .build()
                .schedule();
    }
}
于 2015-03-07T11:35:46.763 に答える
8

アラーム マネージャーを使用してサービスをスケジュールする必要があります。まず、サービスの保留中のインテントを作成します。

Intent ii = new Intent(getApplicationContext(), MyService.class);
PendingIntent pii = PendingIntent.getService(getApplicationContext(), 2222, ii,
PendingIntent.FLAG_CANCEL_CURRENT);

次に、アラーム マネージャを使用してスケジュールします。

//getting current time and add 5 seconds to it
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 5);
//registering our pending intent with alarmmanager
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), pi);

これにより、現在の時刻の 5 秒後にサービスが開始されます。アラームを繰り返すことができます。

于 2013-06-04T22:02:11.410 に答える
0

Alarm Managerを使用して、指定した時刻にサービスを開始し、指定した間隔でアラームを繰り返すことができます。アラームが鳴ったら、サービスを開始してサーバーに接続し、必要なものを作ることができます

于 2012-05-02T19:58:52.353 に答える