我需要在启动时启动服务。我搜了很多。他们正在谈论Broadcastreceiver。由于我是android开发的新手,所以我对Android的服务一无所知。请提供一些源代码。
AlarmManager
重新启动后开始定期运行,您需要遵循非常相似的步骤(区别在于onReceive
方法的内容)
我需要在启动时启动服务。我搜了很多。他们正在谈论Broadcastreceiver。由于我是android开发的新手,所以我对Android的服务一无所知。请提供一些源代码。
AlarmManager
重新启动后开始定期运行,您需要遵循非常相似的步骤(区别在于onReceive
方法的内容)
Answers:
创建一个BroadcastReceiver
并注册以接收ACTION_BOOT_COMPLETED。您还需要RECEIVE_BOOT_COMPLETED权限。
阅读:侦听和广播全局消息, 以及设置警报
您的接收者:
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>
可以注册您自己的应用程序服务,以便在设备启动后自动启动。例如,当您想从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
android.intent.category.LAUNCHER
!
此处发布的大多数解决方案都缺少重要的一环:在没有唤醒锁的情况下执行此操作可能会导致服务在完成处理之前被杀死。在另一个线程中看到了该解决方案,也在此处回答。
以来 api 26中已弃用WakefulBroadcastReceiver,因此建议 将API级别设置为26以下
您需要获取唤醒锁。幸运的是支持库为我们提供了执行此操作的类:
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>
还要在清单中注册您创建的服务,并使用权限为
<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);
}
}
首先在您的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();
}
}
}
在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>
请检查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版本不允许从接收器启动服务
startForeground()
在您的服务中使用。否则,Android及其用户会因为浪费空间而终止您的服务,并且您会在Android Market中收到一些不愉快的评论。在大多数情况下,您认为希望服务在引导时启动,最好使用来AlarmManager
服务,以便服务可以定期运行而不是连续运行。