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


当前回答

这是如何让一个活动在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);
        }
    }

}

注意: 调用i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);重要,因为活动是从活动外部的上下文启动的。没有这一点,活动就不会开始。

此外,<receiver>标签中的值android:enabled, android:exported和android:permission似乎不是强制性的。应用程序接收没有这些值的事件。请看这里的例子。

其他回答

这是如何让一个活动在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);
        }
    }

}

注意: 调用i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);重要,因为活动是从活动外部的上下文启动的。没有这一点,活动就不会开始。

此外,<receiver>标签中的值android:enabled, android:exported和android:permission似乎不是强制性的。应用程序接收没有这些值的事件。请看这里的例子。

对于flutter用户,可以创建一个名为MainActivityReceiver的文件。Kt在包文件夹。如。android / app / src / main /芬兰湾的科特林/ 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文件。

另一种方法是使用android.intent.action.USER_PRESENT而不是android.intent.action.BOOT_COMPLETED来避免引导过程中的减速。但这只在用户启用锁屏时才成立-否则此意图永远不会广播。

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

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

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

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

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