当手机启动在Android上时,我如何启动我的应用程序?

我尝试使用样例代码在本教程中,但它似乎过时了,它没有工作。所以我必须做出什么改变,什么文件有我的应用程序自动启动时,Android完成启动?

356224 次浏览

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


}

来源:https://web.archive.org/web/20150520124552/http://www.androidsnippets.com/autostart-an-application-at-bootup

首先,你需要AndroidManifest.xml中的权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

同样,在你的__abc0中,定义你的服务并监听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);
}
}
}

现在,当电话启动时,您的服务应该正在运行。

此外,如果你不想修改代码,你可以使用像AutoStart这样的应用程序在启动时启动一个android应用程序:自动启动-没有根目录

Sean的解决方案最初并不适合我(Android 4.2.2)。我必须在同一个Android项目中添加一个虚拟活动,并在设备上手动运行该活动至少一次。然后Sean的解决方案开始工作,BroadcastReceiver在随后的重新启动后得到通知。

这是如何使活动在android设备重启后开始运行:

将这段代码插入到你的AndroidManifest.xml文件中,在<application>元素中(<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(匹配manifest中为<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);
}
}


}
< p >注意: i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);调用很重要,因为活动是从活动外部的上下文启动的。

另外,<receiver>标记中的值android:enabledandroid:exportedandroid:permission似乎不是强制性的。应用程序接收没有这些值的事件。参见示例在这里

另一种方法是使用android.intent.action.USER_PRESENT而不是android.intent.action.BOOT_COMPLETED来避免引导过程中的减速。但如果用户启用了锁定屏幕,则此值仅为true -否则此意图永远不会广播。

参考博客- Android ACTION_USER_PRESENT意图的问题

截图

我想在这个问题上补充一点,这是我几天来一直面临的问题。我试了所有的答案,但都不管用。如果你使用的是安卓5.1版本,请更改这些设置。

如果你使用的是android 5.1版本,那么你必须从应用程序设置中取消选择(限制启动)。

>应用>你的应用>限制启动(取消选择)

Android 10有背景限制。

对于android 10和所有版本的android,请按照此步骤在重启或打开手机后启动应用程序

在Android Manifest中添加这两个权限

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

对于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文件。