Android-起動時にサービスを開始する


109

起動時にサービスを開始する必要があります。たくさん検索しました。彼らはBroadcastreceiverについて話している。私はAndroid開発に不慣れなため、Androidのサービスについて明確に把握できませんでした。ソースコードを提供してください。


25
@ user244540:継続的に価値を提供している場合(VOIPクライアントなど)を除き、サービスを永久に実行するつもりで「起動時にサービスを開始」しないでください。そのような場合startForeground()は、サービスでご利用ください。そうしないと、Androidとそのユーザーがスペースの浪費としてサービスを停止し、Androidマーケットで不愉快なコメントを受け取ります。起動時にサービスを開始したいと考えるほとんどの状況では、サービスを継続的にAlarmManager実行するのではなく、定期的に実行できるように使用する方が適切です。
CommonsWare 2010

2
@CommonsWare:いいですね。ただし、AlarmManager再起動後に定期実行を開始するには、非常によく似た手順(onReceive方法の内容に違いがある)に従う必要があることに注意してください
stanwise

1
@CommonsWare:非常に良いコメント、私はこの質問に出くわしました、そしてあなたのヒントは私の状況に正確に適合しています。それが答えだったら、投票しました:-)
chiccodoro 2013年

回答:


95

2
ウェイクロックはどうですか?サービスの開始中、デバイスはスリープ状態になる場合があります...
MarianPaździoch15年

サービスを開始するには、少なくとも1回はモバイルを起動する必要がありますか?
pathe.kiran 2015年

@MarianPaździochは正しいです。ウェイクロックが必要です。以下の私の答えを参照してください:stackoverflow.com/a/30970167/473201
phreakhead '21 / 06/15


最新のURLが古くなっています
Prizoff

192

あなたの受信機:

public class MyReceiver extends BroadcastReceiver {   

    @Override
    public void onReceive(Context context, Intent intent) {

     Intent myIntent = new Intent(context, YourService.class);
     context.startService(myIntent);

    }
}

あなたのAndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.broadcast.receiver.example"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">

        <activity android:name=".BR_Example"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    <!-- Declaring broadcast receiver for BOOT_COMPLETED event. -->
        <receiver android:name=".MyReceiver" android:enabled="true" android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

    </application>

    <!-- Adding the permission -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

</manifest>

5
記事へのリンクは無効ですが、サンプルコードだけで十分です。そのため、+ 1 :)
Alex

3
実際には、少し改善する必要があります。レシーバーでwakelockを使用する必要があります。そうしないと、サービスが開始されない可能性がほとんどありません。
Vladimir Ivanov

これを機能させるには、少なくとも1回は携帯電話を起動する必要がありますか?
pathe.kiran

1
いいえ。ただし、Android 3.0以降、少なくとも1つはアプリケーションを実行する必要があります
Vladimir Ivanov

アプリが設定から強制終了された場合、これは機能しますか?アプリはまだウェイクアップしますか?
スリハリカラント2017年

32

デバイスの起動時に自動的に起動する独自のアプリケーションサービスを登録することができます。たとえば、httpサーバーからプッシュイベントを受信し、新しいイベントが発生したらすぐにユーザーに通知する場合に必要です。サービスを開始する前に、ユーザーが手動でアクティビティを開始する必要はありません...

とても簡単です。まず、アプリにRECEIVE_BOOT_COMPLETED権限を付与します。次に、BroadcastReveiverを登録する必要があります。これをBootCompletedIntentReceiverと呼びます。

Manifest.xmlは次のようになります。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.jjoe64">
 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
 <application>
  <receiver android:name=".BootCompletedIntentReceiver">
   <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
   </intent-filter>
  </receiver>
  <service android:name=".BackgroundService"/>
 </application>
</manifest>

最後のステップとして、レシーバーを実装する必要があります。このレシーバーはバックグラウンドサービスを開始するだけです。

package com.jjoe64;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

import com.jjoe64.BackgroundService;

public class BootCompletedIntentReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
  if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
   Intent pushIntent = new Intent(context, BackgroundService.class);
   context.startService(pushIntent);
  }
 }
}

http://www.jjoe64.com/2011/06/autostart-service-on-device-boot.htmlから


3
上記と同じですが、本当にシンプルで高速です。この投稿にアクセスする場合は、これを使用してください。
dbkoren 2013

唯一の違いは、これがマニフェストでサービスを宣言することです。これは正しいことです。
Joaquin Iurchuk、2015年

マニフェストでサービスを宣言することは正しいだけでなく、必須です。アクティビティと同じ
Tim

主な活動はどこですか!?アクティビティなしでアプリを作成することは正しくありませんandroid.intent.category.LAUNCHER
ニック

@ L'Esperanzaは確かに、目に見えるアクティビティのないアプリを持つことができます!
2016年

15

ここに掲載されているほとんどのソリューションには重要な部分が欠けています。ウェイクロックなしでそれを行うと、サービスが処理を完了する前に強制終了されるリスクがあります。この解決策を別のスレッドで見て、ここでも答えてください。

以来WakefulBroadcastReceiverは、API 26で廃止され、それが推奨される 26以下のAPIレベルのために

ウェイクロックを取得する必要があります。幸い、サポートライブラリは、これを行うクラスを提供します。

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // This is the Intent to deliver to our service.
        Intent service = new Intent(context, SimpleWakefulService.class);

        // Start the service, keeping the device awake while it is launching.
        Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime());
        startWakefulService(context, service);
    }
}

次に、サービスで、ウェイクロックを解放してください。

    @Override
    protected void onHandleIntent(Intent intent) {
        // At this point SimpleWakefulReceiver is still holding a wake lock
        // for us.  We can do whatever we need to here and then tell it that
        // it can release the wakelock.

...
        Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime());
        SimpleWakefulReceiver.completeWakefulIntent(intent);
    }

WAKE_LOCK権限を追加し、マニフェストにレシーバーを登録することを忘れないでください。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

...

<service android:name=".SimpleWakefulReceiver">
    <intent-filter>
        <action android:name="com.example.SimpleWakefulReceiver"/>
    </intent-filter>
</service>

1
マニフェストファイルでは、SimpleWakefulReceiverはサービスではありません。
Desmond Lua 2016年

1
WakefulBroadcastReceiverは非推奨
Amin Pinjari

5

BOOT_COMPLETEおよびREBOOTに登録する必要があります

<receiver android:name=".Services.BootComplete">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.REBOOT"/>
        </intent-filter>
    </receiver> 

2
文献によると、「android.intent.action.REBOOT」は特権付きアプリ/コードでのみ使用できます。それ以外の場合、これはどのような利点がありますか?
XMAN

1

また、作成したサービスをマニフェストに登録し、次のように使用権限を使用します

<application ...>
   <service android:name=".MyBroadcastReceiver">
        <intent-filter>
            <action android:name="com.example.MyBroadcastReciver"/>
        </intent-filter>
   </service>
</application>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

ブラッドキャストであなたのサービスを呼び出します

public class MyBroadcastReceiver extends BroadcastReceiver 
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Intent myIntent = new Intent(context, MyService.class);
        context.startService(myIntent);
    }
}

サービス内のインテントフィルターを使用する理由
Joaquin Iurchuk、2015年

起動が完了するとMyServiceが呼び出されるため
SoftEye

その場合、サービスクラスはサービスとブロードキャストレシーバーを拡張します。私は正しいですか?
Joaquin Iurchuk、2015

クラスはServiceクラスを拡張します。
SoftEye 2015

2
ここで何か問題があります。このサービスは、ブロードキャストレシーバーから呼び出されることになっています。しかし、あなたのサービスはブロードキャストレシーバーであり、その後、サービスクラスはブロードキャストレシーバーを拡張しないと言っています。そのため、Boot Completed Broadcastを受け取りません。onReceiveメソッドを宣言するときに何をオーバーライドしますか?
Joaquin Iurchuk 2015年

0

まず、manifest.xmlファイルにレシーバーを登録します。

    <receiver android:name="com.mileagelog.service.Broadcast_PowerUp" >
        <intent-filter>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
        </intent-filter>
    </receiver>

次に、このレシーバーのブロードキャストを次のように記述します。

public class Broadcast_PowerUp extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    if (action.equals(Intent.ACTION_POWER_CONNECTED)) {
        Toast.makeText(context, "Service_PowerUp Started",
                Toast.LENGTH_LONG).show();


    } else if (action.equals(Intent.ACTION_POWER_DISCONNECTED)) {



        Toast.makeText(context, "Service_PowerUp Stoped", Toast.LENGTH_LONG)
        .show();
    }
  }
}

0

Android OOSが28以上の場合にサービスを再起動するには、次のコードを使用します。このコードを使用KOTLIN VERSION 1)マニフェストに権限を追加します

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

2)を作成しClassて拡張するBroadcastReceiver

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.os.Build
import android.util.Log
import androidx.core.content.ContextCompat



class BootCompletedReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, arg1: Intent?) {
        Log.d("BootCompletedReceiver", "starting service...")
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            ContextCompat.startForegroundService(context, Intent(context, YourServiceClass::class.java))
        } else {
            context.startService(Intent(context, YourServiceClass::class.java))
        }
    }
}

3)アプリケーションタグの下で、次のようにマニフェストファイルで宣言します。

<receiver android:name=".utils.BootCompletedReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        </intent-filter>
    </receiver>

-1

Plsは26を超えるAPIについてJobSchedulerをチェックします

WakeLockはこれに最適なオプションですが、APIレベル26では推奨されていません。26を超えるAPIレベルを検討する場合は、このリンクを 確認し
ください。https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html# startWakefulService(android.content.Context、%20android.content.Intent)

それは言う

Android O以降、バックグラウンドチェックの制限により、このクラスは一般的に役に立たなくなりました。(ブロードキャストの受信からサービスを開始することは、一般に安全ではありません。この時点でアプリがフォアグラウンドにあることが保証されていないため、許可されているためです。)代わりに、開発者はandroidを使用する必要があります。 app.job.JobSchedulerを使用してジョブをスケジュールします。これにより、アプリがウェイクロックを保持している必要はありません(システムがジョブのウェイクロックを保持します)。

cosider JobScheduler
https://developer.android.com/reference/android/app/job/JobSchedulerのように

開始するよりも何かをすることであり、それを維持することである場合、ブロードキャストACTION_BOOT_COMPLETEDを受信できます。

フォアグラウンドplsに関するものでない場合は、ユーザー補助機能サービスが実行できるかどうかを確認してください

新しいAndroidバージョンではレシーバーからのサービスの開始が許可されていないため、別のオプションは、ブロードキャストレシーバーからアクティビティを開始し、onCreate()内でサービスを開始した後にアクティビティを終了することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.