我需要在启动时启动服务。我搜索了很多。他们正在谈论广播接收器。由于我是 android 开发的新手,所以我对 Android 上的服务没有清楚的了解。请提供一些源代码。
9 回答
您的接收器:
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>
创建一个BroadcastReceiver
并注册它以接收ACTION_BOOT_COMPLETED。您还需要RECEIVE_BOOT_COMPLETED权限。
阅读:收听和广播全球消息, 并设置警报
可以注册您自己的应用程序服务,以便在设备启动时自动启动。例如,当您想从 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
此处发布的大多数解决方案都缺少一个重要部分:在没有唤醒锁的情况下执行此操作会冒着您的服务在完成处理之前被杀死的风险。在另一个线程中看到了这个解决方案,也在这里回答。
由于在 api 26 中不推荐使用 WakefulBroadcastReceiver ,因此建议API 级别低于 26
您需要获得唤醒锁。幸运的是,Support 库为我们提供了一个类来执行此操作:
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>
你应该注册 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>
还要在 Manifest 中注册您创建的服务并将使用权限注册为
<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"/>
然后在 braod cast Reciever 调用你的服务
public class MyBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Intent myIntent = new Intent(context, MyService.class);
context.startService(myIntent);
}
}
在Android O
或更多操作系统中重新启动服务,即 OS >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>
首先在 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();
}
}
}
请检查JobScheduler是否有 26 以上的 api
WakeLock是最好的选择,但它在 api 级别 26 中已弃用,如果您认为 api 级别高于 26,
请检查此链接
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
如果不是关于前台,请检查无障碍服务是否可以
另一种选择是从广播接收器启动一个活动,并在 onCreate() 内启动服务后完成它,因为较新的 android 版本不允许从接收器启动服务