web-dev-qa-db-ja.com

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

ブート時にサービスを開始する必要があります。よく検索しました。彼らはBroadcastreceiverについて話している。 Androidの開発は初めてなので、Androidのサービスについて明確な画像を得ることができませんでした。ソースコードを提供してください。

106
harish
94
Peter Knego

あなたの受信機:

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>
191
Vladimir Ivanov

デバイスの起動時に自動的に開始する独自のアプリケーションサービスを登録することができます。これは、たとえば、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>

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

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

32
appsthatmatter

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

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>
15
phreakhead

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> 
5

また、作成したサービスをマニフェストに登録し、使用許可を

<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);
    }
}
1
SoftEye

まず、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
Manoj Tarkar