サービスを作成し、携帯電話が再起動するか強制的に閉じるまで、このサービスを常に実行したい。サービスはバックグラウンドで実行する必要があります。
作成されたサービスと開始サービスのサンプルコード:
サービスの開始:
Intent service = new Intent(getApplicationContext(), MyService.class);
getApplicationContext().startService(service);
サービス:
public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO do something useful
HFLAG = true;
//smsHandler.sendEmptyMessageDelayed(DISPLAY_DATA, 1000);
return Service.START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// TODO for communication return IBinder implementation
return null;
}
}
マニフェスト宣言:
<service
Android:name=".MyService"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name" >
</service>
アプリケーションが一時停止したときなど、このサービスを常に実行することは可能ですか?しばらくすると、アプリケーションが一時停止し、サービスも一時停止または停止します。このサービスをバックグラウンドでいつでも実行できますか。
「アプリケーションが一時停止したときなど、このサービスをいつでも実行できますか?」
はい。
サービスのonStartCommandメソッドでSTART_STICKYを返します。
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
StartService(MyService)を使用してバックグラウンドでサービスを開始し、バインドされたクライアントの数に関係なく常にアクティブな状態を維持します。
Intent intent = new Intent(this, PowerMeterService.class);
startService(intent);
バインダーを作成します。
public class MyBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
サービス接続を定義します。
private ServiceConnection m_serviceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
m_service = ((MyService.MyBinder)service).getService();
}
public void onServiceDisconnected(ComponentName className) {
m_service = null;
}
};
BindServiceを使用してサービスにバインドします。
Intent intent = new Intent(this, MyService.class);
bindService(intent, m_serviceConnection, BIND_AUTO_CREATE);
サービスでは、通知が閉じられた後に適切なアクティビティを起動することができます。
private void addNotification() {
// create the notification
Notification.Builder m_notificationBuilder = new Notification.Builder(this)
.setContentTitle(getText(R.string.service_name))
.setContentText(getResources().getText(R.string.service_status_monitor))
.setSmallIcon(R.drawable.notification_small_icon);
// create the pending intent and add to the notification
Intent intent = new Intent(this, MyService.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
m_notificationBuilder.setContentIntent(pendingIntent);
// send the notification
m_notificationManager.notify(NOTIFICATION_ID, m_notificationBuilder.build());
}
マニフェストを変更して、アクティビティをシングルトップモードで起動する必要があります。
Android:launchMode="singleTop"
システムがリソースを必要とし、サービスがあまりアクティブでない場合は、強制終了される可能性があることに注意してください。これが受け入れられない場合、startForegroundを使用してサービスをフォアグラウンドに移動します。
startForeground(NOTIFICATION_ID, m_notificationBuilder.build());
独自のプロセスでサービスを開始するには、xml宣言で次を指定する必要があります。
<service
Android:name="WordService"
Android:process=":my_process"
Android:icon="@drawable/icon"
Android:label="@string/service_name"
>
</service>
ここでは、私にとって本当に役立つ良いチュートリアルを見つけることができます
http://www.vogella.com/articles/AndroidServices/article.html
お役に立てれば
サービスにstartForeground
を実装できます。サービスが停止した場合でも、startCommand()
でSTART_STICKY
を使用して再起動できます。これが正しい実装であるかどうかはわかりません。
すでにサービスがあり、それが常に機能するようにしたい場合は、2つのことを追加する必要があります。
サービス自体で:
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
マニフェストで:
Android:launchMode="singleTop"
サービスで必要でない限り、バインドを追加する必要はありません。
Service
を常に実行し続けるシンプルで明確な方法を見つけました。
この男はそれをとても明確に説明し、良いアルゴリズムを使用しました。彼のアプローチは、サービスが強制終了されるときにブロードキャストを送信し、それを使用してサービスを再起動することです。
あなたはそれをチェックアウトする必要があります: http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-Android
これをマニフェストに追加します。
<service
Android:name=".YourServiceName"
Android:enabled="true"
Android:exported="false" />
サービスクラスを追加します。
public class YourServiceName extends Service {
@Override
public void onCreate() {
super.onCreate();
// Timer task makes your service will repeat after every 20 Sec.
TimerTask doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
// Add your code here.
}
});
}
};
//Starts after 20 sec and will repeat on every 20 sec of time interval.
timer.schedule(doAsynchronousTask, 20000,20000); // 20 sec timer
(enter your own time)
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO do something useful
return START_STICKY;
}
}
放送受信機は必要ありません。スティーブン・ドネッカーによる上記の例のapi(serviceconnection)の1つをコピーして、Googleに貼り付けるのに苦労すると、これが得られます https://www.concretepage.com/Android/android-local-バインドされたサービスの例とバインダーとサービスの接続
私はこの問題を克服しており、私のサンプルコードは次のとおりです。
メインアクティビティに以下の行を追加します。BackGroundClassはサービスクラスです。このクラスはNew-> JavaClassで作成できます(このクラスでは、発生する必要のあるプロセス(タスク)を追加しますバックグラウンドで)。便宜上、最初にバックグラウンドプロセスとして通知着信音でそれらを示します。
startService(new Intent(this, BackGroundClass .class));
BackGroundClassに、コーディングを含めるだけで、結果が表示される場合があります。
import Android.app.Service;
import Android.content.Intent;
import Android.media.MediaPlayer;
import Android.os.IBinder;
import Android.provider.Settings;
import Android.support.annotation.Nullable;
import Android.widget.Toast;
public class BackgroundService extends Service {
private MediaPlayer player;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
player = MediaPlayer.create(this,Settings.System.DEFAULT_RINGTONE_URI);
player.setLooping(true);
player.start();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
player.stop();
}
}
AndroidManifest.xmlで、これを追加してみてください。
<service Android:name=".BackgroundService"/>
プログラムを実行し、アプリケーションを開くだけで、バックグラウンドで通知アラートを見つけることができます。たとえアプリケーションを終了しても、アプリケーションをオフにしたり、アプリケーションをアンインストールしたりしない限り、着信音が聞こえる場合があります。これは、通知アラートがバックグラウンドプロセスにあることを示します。このように、バックグラウンド用のプロセスを追加できます。
Kind Attention:バックグラウンドプロセスであっても1回だけ実行されるため、TOASTで確認しないでください。
それが役立つことを願っています... !!