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


241

我尝试在链接中使用示例代码,但它似乎已过时,因此无法正常工作。那么,当Android完成启动后,我需要进行哪些更改以及使我的应用程序自动启动哪些文件?

Answers:


315

首先,您需要在中获得许可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);
        }
    }
}

现在,您的服务应该在手机启动时正在运行。


8
活动:developer.android.com/guide/topics/fundamentals/activities.html 服务:developer.android.com/guide/topics/fundamentals/services.html 要在电话实际启动时启动应用程序,您需要如上所示注册服务,然后在其中使用startActivity()启动应用程序。但是,如果用户不要求将屏幕放在用户面前,则不是一个好主意。
肖恩·舒尔特

19
只是想补充一点,最好使用Intent.ACTION_BOOT_COMPLETED而不是在Receiver中对字符串进行硬编码。另外,Intent(context, MySystemService.class)在创建Intent 时应使用新的构造函数。
brianestey 2012年

7
如果使用了意图过滤器,是否有理由检查意图类型?
Pijusn

1
由于某种原因,我Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own filepublic class线了。有任何想法吗?
pattyd

3
什么是MySystemService?
体育“

120

这是在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(与清单中元素的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<receiver>标签似乎并没有强制性。该应用接收的事件没有这些值。请参阅此处的示例。


我喜欢这种“捷径”,以避免不得不进行本地服务。该代码是否属于扩展类Application?也许在onCreate()
某处某人2014年

2
它看起来像代码的那款应在onReceive()一个的BroadcastReceiver
有人的地方

2
该代码应该在活动“ yourActivityrRunOnStartup”中,该活动扩展了BroadcastReceiver类并在onReceive()方法内部。
thrylos 2014年

2
我尝试给10个投票,但不能。抱歉,谢谢。
赛卡2014年

1
这对我有用,但是只有在意图过滤器中只有“ <action android:name =” android.intent.action.BOOT_COMPLETED“ />”时才可以。如果我用了另外两个,那是行不通的。
emhomm4

67

收听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


此代码放置在哪个文件中:公共类BootUpReceiver扩展了BroadcastReceiver
Jeff Janes,

有效,谢谢!(适用于android 4.0.4 API级别15)。是的,这是2017年,我仍然需要开发Android 4.0.4 .. ::
Luca

2
在Android 8.0上不起作用!虽然适用于Android 4.0。
codezombie

我正在使用相同的代码,但无法正常使用kitkat版本,我想在Android电视启动时启动应用程序
Ashutosh Tripathi

@AshutoshTripathi您已解决此问题吗?
ralphgabb19年

10

另外,如果您不想修改代码,则可以使用AutoStart之类的应用来在启动时启动android应用:AutoStart-No root


2

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


0

屏幕截图

我想在这个问题上补充我几天要面对的观点。我尝试了所有答案,但这些都不适合我。如果您使用的是Android 5.1版,请更改这些设置。

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

设置>应用>您的应用>限制启动(取消选择)


3
我认为这从来都不是标准。我从未听说过“限制发射”。从来没有在不同的三星,华硕,索尼上见过它。对我来说这没有任何意义。它说只允许启动该应用程序?这是什么意思?
令人难以置信的

0

另一种方法是在引导过程中使用android.intent.action.USER_PRESENT而不是android.intent.action.BOOT_COMPLETED避免速度变慢。但这仅true在用户启用了锁定屏幕的情况下-否则就不会广播此意图。

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


因此,换句话说,不应该使用它
相信
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.