我尝试使用this链接中的示例代码,但它似乎已过时且无效。那么当Android完成启动时,我需要做些什么更改以及让我的应用自动启动哪些文件?
答案 0 :(得分:295)
首先,您需要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);
}
}
}
现在,您的服务应该在手机启动时运行。
答案 1 :(得分:107)
这是如何在Android设备重启后开始运行活动:
将此代码插入AndroidManifest.xml
文件中的<application>
元素内{{strong> <{1}}元素中
<activity>
然后创建一个新类<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
元素指定的android:name
:
<receiver>
注意:
调用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);
代码中的值android:enabled
,android:exported
和android:permission
似乎并非强制要求。应用程序接收没有这些值的事件。请参阅示例here。
答案 2 :(得分:55)
倾听ACTION_BOOT_COMPLETE并从那里做你需要做的事。这里有一个code snippet。
<强>更新强>
答案的原始链接已关闭,因此根据评论,这里是链接代码,因为当链接关闭时,没有人会错过代码。
在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);
}
}
答案 3 :(得分:10)
此外,如果您不想修改代码,可以使用AutoStart等应用程序,在启动时启动Android应用程序:AutoStart - No root
答案 4 :(得分:2)
Sean的解决方案最初对我不起作用(Android 4.2.2)。我必须在同一个Android项目中添加一个虚拟活动,并至少在设备上手动运行一次活动。然后Sean的解决方案开始工作,并在随后重新启动后通知BroadcastReceiver。
答案 5 :(得分:2)
对于flutter用户,您可以在包文件夹中创建一个名为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
文件,参考第一个答案。
答案 6 :(得分:1)
对于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的Draw overlay权限
因此将其添加到您的第一个活动中
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
}
}
}
答案 7 :(得分:-1)
另一种方法是使用android.intent.action.USER_PRESENT
而不是android.intent.action.BOOT_COMPLETED
来避免在启动过程中减慢速度。但是如果用户启用了锁定屏幕,那么这只是true
- 否则这个意图永远不会被广播。
参考博客 - The Problem With Android’s ACTION_USER_PRESENT Intent
答案 8 :(得分:-1)
我想在这个问题中添加一点,我面对了几天。我尝试了所有的答案,但那些不适合我。如果您使用的是Android 5.1版,请更改这些设置。
如果您使用的是Android版本5.1,那么您必须从应用设置中取消选择(限制启动)。
设置&gt; app&gt;你的应用&gt;限制启动(取消选择)