web-dev-qa-db-ja.com

Androidサービスは常に実行する必要があります(一時停止または停止しないでください)

サービスを作成し、携帯電話が再起動するか強制的に閉じるまで、このサービスを常に実行したい。サービスはバックグラウンドで実行する必要があります。

作成されたサービスと開始サービスのサンプルコード:

サービスの開始:

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>

アプリケーションが一時停止したときなど、このサービスを常に実行することは可能ですか?しばらくすると、アプリケーションが一時停止し、サービスも一時停止または停止します。このサービスをバックグラウンドでいつでも実行できますか。

「アプリケーションが一時停止したときなど、このサービスをいつでも実行できますか?」

はい。

  1. サービスのonStartCommandメソッドでSTART_STICKYを返します。

    public int onStartCommand(Intent intent, int flags, int startId) {
            return START_STICKY;
    }
    
  2. StartService(MyService)を使用してバックグラウンドでサービスを開始し、バインドされたクライアントの数に関係なく常にアクティブな状態を維持します。

    Intent intent = new Intent(this, PowerMeterService.class);
    startService(intent);
    
  3. バインダーを作成します。

    public class MyBinder extends Binder {
            public MyService getService() {
                    return MyService.this;
            }
    }
    
  4. サービス接続を定義します。

    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;
            }
    };
    
  5. BindServiceを使用してサービスにバインドします。

            Intent intent = new Intent(this, MyService.class);
            bindService(intent, m_serviceConnection, BIND_AUTO_CREATE);
    
  6. サービスでは、通知が閉じられた後に適切なアクティビティを起動することができます。

    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());
    }
    
  7. マニフェストを変更して、アクティビティをシングルトップモードで起動する必要があります。

              Android:launchMode="singleTop"
    
  8. システムがリソースを必要とし、サービスがあまりアクティブでない場合は、強制終了される可能性があることに注意してください。これが受け入れられない場合、startForegroundを使用してサービスをフォアグラウンドに移動します。

            startForeground(NOTIFICATION_ID, m_notificationBuilder.build());
    
87

独自のプロセスでサービスを開始するには、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

お役に立てれば

8
Juan

簡単な解決策は、システムが停止したときにサービスを再起動することです。

このメソッドの非常にシンプルな実装を見つけました。

Androidサービスを停止できないようにする方法

4
Alecs

サービスにstartForegroundを実装できます。サービスが停止した場合でも、startCommand()START_STICKYを使用して再起動できます。これが正しい実装であるかどうかはわかりません。

2
Srikanth Roopa

すでにサービスがあり、それが常に機能するようにしたい場合は、2つのことを追加する必要があります。

  1. サービス自体で:

    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }
    
  2. マニフェストで:

    Android:launchMode="singleTop"
    

サービスで必要でない限り、バインドを追加する必要はありません。

1
Gilad Levinson

Serviceを常に実行し続けるシンプルで明確な方法を見つけました。

この男はそれをとても明確に説明し、良いアルゴリズムを使用しました。彼のアプローチは、サービスが強制終了されるときにブロードキャストを送信し、それを使用してサービスを再起動することです。

あなたはそれをチェックアウトする必要があります: http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-Android

0
Hammad Nasir

これをマニフェストに追加します。

      <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;
    }

}
0
Avinash Shinde

放送受信機は必要ありません。スティーブン・ドネッカーによる上記の例のapi(serviceconnection)の1つをコピーして、Googleに貼り付けるのに苦労すると、これが得られます https://www.concretepage.com/Android/android-local-バインドされたサービスの例とバインダーとサービスの接続

0
Chirag Dave

私はこの問題を克服しており、私のサンプルコードは次のとおりです。

メインアクティビティに以下の行を追加します。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で確認しないでください。

それが役立つことを願っています... !!

0
Hari_Haran_N_S.