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

Poo*_*jan 227 android startup broadcastreceiver

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

Sea*_*lte 307

首先,您需要获得以下权限AndroidManifest.xml:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Run Code Online (Sandbox Code Playgroud)

此外,在您的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>
Run Code Online (Sandbox Code Playgroud)

然后,您需要定义将获得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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 只是想补充一点,最好使用`Intent.ACTION_BOOT_COMPLETED`而不是对接收器中的字符串进行硬编码.此外,在创建Intent时应该使用新的`Intent(context,MySystemService.class)`构造函数. (19认同)
  • 活动:http://developer.android.com/guide/topics/fundamentals/activities.html服务:http://developer.android.com/guide/topics/fundamentals/services.html在电话实际启动您的应用程序启动,你需要注册如上所示的服务,然后在那里你可以使用startActivity()来启动你的应用程序.但是,如果他们没有要求屏幕,那么将屏幕放在用户面前并不是一个好主意. (8认同)
  • 如果使用了intent-filter,是否有理由检查意图类型? (6认同)
  • 什么是MySystemService? (3认同)
  • @brianestey好点,你可以随时编辑答案顺便说一下! (2认同)
  • @agmezr 伙计,我们是 android 人,请在 IOS 标签中提出问题:) (2认同)

thr*_*los 113

这是在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>
Run Code Online (Sandbox Code Playgroud)

然后创建一个新类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);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

注意:调用i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);很重要,因为活动是从活动外部的上下文启动的.没有这个,活动将无法启动.

此外,价值观android:enabled,android:exportedandroid:permission<receiver>标签似乎并没有强制性.应用程序接收没有这些值的事件.请参阅此处的示例.

  • 看起来那段代码应该在`BroadcastReceiver`的`onReceive()`中 (2认同)
  • 这段代码应该在活动中,即"yourActivityrRunOnStartup",它扩展了BroadcastReceiver类和onReceive()方法. (2认同)
  • 我尝试给10个投票,但不能。抱歉,谢谢。 (2认同)

Hap*_*ard 61

听取ACTION_BOOT_COMPLETE并从那里做你需要的.这里有一段代码片段.

更新:

答案的原始链接已关闭,因此根据评论,这里是链接代码,因为当链接关闭时,没有人会错过代码.

在AndroidManifest.xml(application-part)中:

<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>
Run Code Online (Sandbox Code Playgroud)

...

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Run Code Online (Sandbox Code Playgroud)

...

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

}
Run Code Online (Sandbox Code Playgroud)

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

  • 在Android 8.0上不起作用!虽然适用于Android 4.0。 (2认同)

Ton*_*ony 10

另外,如果您不想修改代码,可以使用AutoStart等应用程序,在启动时启动Android应用程序:AutoStart - No root


Sha*_*aon 7

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"/>
Run Code Online (Sandbox Code Playgroud)

将其添加到您的应用程序标签中

<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>
Run Code Online (Sandbox Code Playgroud)

添加此类以在启动时启动 Activity

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);
    }
 }}
Run Code Online (Sandbox Code Playgroud)

我们需要 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)