これは、サービスを永続的に維持するための半異なる方法です。必要に応じて、コードでそれを殺す方法があります
バックグラウンド サービス:
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();
}
}