我尝试使用这篇教程中的示例代码,但它似乎已经过时了,而且没有起作用。那么我需要做哪些更改,修改哪些文件,才能使我的应用在Android启动完成后自动启动?
首先,在你的 AndroidManifest.xml
文件中需要添加权限声明:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
同时,在你的AndroidManifest.xml
文件中,定义你的服务并监听BOOT_COMPLETED事件:
<service android:name=".MyService" android:label="My Service">
<intent-filter>
<action android:name="com.myapp.MyService" />
</intent-filter>
</service>
<receiver
android:name=".receiver.StartMyServiceAtBootReceiver"
android:label="StartMyServiceAtBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
然后您需要定义接收器来接收BOOT_COMPLETED操作并启动您的服务。
public class StartMyServiceAtBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Intent serviceIntent = new Intent(context, MyService.class);
context.startService(serviceIntent);
}
}
}
现在你的服务应该可以在手机启动时运行。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver
android:enabled="true"
android:exported="true"
android:name="yourpackage.yourActivityRunOnStartup"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
接着创建一个新的类 yourActivityRunOnStartup
(与清单文件中 <receiver>
元素指定的 android:name
相匹配):
package yourpackage;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class yourActivityRunOnStartup extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
Intent i = new Intent(context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
}
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
很重要,因为该活动是从活动之外的上下文启动的。如果没有这个,该活动将不会启动。<receiver>
标记中的值android:enabled
、android:exported
和android:permission
似乎不是必需的。应用程序可以在没有这些值的情况下接收事件,请参见此处的示例。BroadcastReceiver
的 onReceive()
方法中。 - Someone Somewhere监听 ACTION_BOOT_COMPLETE 并执行所需操作。这里有一个代码片段。
更新:
回答中的原链接已失效,因此根据评论,这里提供了链接的代码,以防链接失效时无法获取代码。
在 AndroidManifest.xml 文件的应用程序部分中:
<receiver android:enabled="true" android:name=".BootUpReceiver"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
...
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
public class BootUpReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, MyActivity.class); //MyActivity can be anything which you want to start on bootup...
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
对于Android 10,存在后台限制。
对于Android 10和所有版本的Android,请按照以下步骤在重新启动或打开手机后启动应用程序:
在Android清单中添加以下两个权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
在你的应用程序标签中添加以下内容
<receiver
android:name=".BootReciever"
android:enabled="true"
android:exported="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
将此类添加到启动时启动活动
public class BootReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Objects.equals(intent.getAction(), Intent.ACTION_BOOT_COMPLETED)) {
Intent i = new Intent(context, SplashActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}}
我们需要为Android 10获取绘制叠加权限。
因此,请在您的第一个活动中添加以下内容:
private fun requestPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
val intent = Intent(
Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + this.packageName)
)
startActivityForResult(intent, 232)
} else {
//Permission Granted-System will work
}
}
}
Sean的解决方案最初对我没有起作用(Android 4.2.2)。我不得不在同一个Android项目中添加一个虚拟活动,并手动在设备上运行该活动至少一次。然后,Sean的解决方案开始起作用,并且在随后的重新启动后通知了BroadcastReceiver。
MainActivityReceiver.kt
的文件。例如:android/app/src/main/kotlin/com/your_company/package
。
MainActivityReceiver.kt
:package com.your_company.package
import android.content.BroadcastReceiver
import android.content.Context;
import android.content.Intent;
class MainActivityReceiver: BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
val i = Intent(context, MainActivity::class.java)
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(i)
}
}
}
请参考第一个答案修改您的AndroidManifest.xml
文件。
AndroidManifest.xml
的指示,而不是提到另一个答案,我认为会更好 :-) - JonasVautherinandroid.intent.action.USER_PRESENT
而不是android.intent.action.BOOT_COMPLETED
,以避免在启动过程中出现减速。但是,只有当用户启用锁屏时,这才是true
- 否则此意图永远不会广播。
我想在这个问题中补充一个观点,这是我遇到了几天的问题。我尝试了所有的答案,但它们对我都不起作用。如果您正在使用Android 5.1版本,请更改以下设置。
如果您正在使用Android 5.1版本,则必须从应用程序设置中取消选择(限制启动)。
设置>应用程序>您的应用程序>取消选择“限制启动”
// To start app after boot
private void startSystemAlertWindowPermission(){
try{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if(! Settings.canDrawOverlays(this)) {
Log.i(TAG, "[startSystemAlertWindowPermission] requesting system alert window permission.");
startActivity(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:"+getPackageName())));
}
}
}catch (Exception e){
Log.e(TAG, "[startSystemAlertWindowPermission] error:", e);
}
}
Intent.ACTION_BOOT_COMPLETED
代替硬编码字符串。同时,在创建意图时应使用新的Intent(context, MySystemService.class)
构造函数。 - brianestey