如何在启动时启动我的应用程序?

时间:2011-06-17 21:12:22

标签: android broadcastreceiver startup

我尝试使用this链接中的示例代码,但它似乎已过时且无效。那么当Android完成启动时,我需要做些什么更改以及让我的应用自动启动哪些文件?

9 个答案:

答案 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:enabledandroid:exportedandroid: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);  
        }

}

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

答案 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)

screenshot

我想在这个问题中添加一点,我面对了几天。我尝试了所有的答案,但那些不适合我。如果您使用的是Android 5.1版,请更改这些设置。

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

设置&gt; app&gt;你的应用&gt;限制启动(取消选择)