间歇性" RECEIVE_BOOT_COMPLETED"失败

时间:2016-01-12 13:47:03

标签: android

我正在尝试创建一个在手机启动时启动的(Android 4.3及更高版本)应用程序。使用我在StackOverflow上找到的其他帖子我能够管理这几次,但似乎每次重新启动手机时它都无法可靠启动。

我的代码使用"正在进行的"用于证明应用程序正在由操作系统启动的通知,但并非每次都会发生。我重新启动了几次,如果应用程序在重新启动之前已经运行,它似乎只会自动启动。

我真的需要在手机启动时100%启动此应用程序(无论应用程序以前是否运行)。

如何确保始终在系统启动时运行?我无法找到任何文档,表明在重新启动手机之前应用程序需要运行才能实现此功能。

我现在使用的方法只是标准的BroadcastReceiver.onReceive响应" RECEIVE_BOOT_COMPLETED"来自OS的信号。它会触发通知,然后启动活动。当它工作时,它可能需要2分钟才能启动(完全没问题)。

有人可以建议我如何在不安装任何其他第三方应用的情况下解决此问题吗?

这是整个项目......

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="uk.co.xxxxxxxxxxx.autostart">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <receiver android:name="uk.co.xxxxxxxxxxx.autostart.StartMyServiceAtBootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <activity android:name=".MainActivity"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

和...

    package uk.co.xxxxxxxxxxxxx.autostart;

import android.app.Notification;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class StartMyServiceAtBootReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent) {
        if (
                Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())
           )
        {
            NotificationManager nm
                    = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

            Notification n = new Notification.Builder(context)
                    .setContentText("In BroadcastReceiver!")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle("AutoStart")
                    .setOngoing(true)
                    .setDefaults(0)
                    .build();

            nm.notify(1, n);

            Intent i = new Intent(context, MainActivity.class);

            i.putExtra("STARTER","BroadcastReceiver");
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }
}

和...

package uk.co.xxxxxxxxxxx.autostart;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent i = getIntent();
        String starter = i.getStringExtra("STARTER");

        if(starter != null) {
            TextView tv = (TextView) findViewById(R.id.textView);
            tv.setText("Started by " + starter);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您还必须注册action.REBOOT

<receiver android:name=".receivers.YourReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.REBOOT" />
    </intent-filter>
</receiver>

答案 1 :(得分:1)

Android接收器&amp; RECEIVE_BOOT_COMPLETED&amp; BOOT_COMPLETED失败

显而易见的事情之后:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"
and:
            <receiver 
                   android:name="com.twiggwidgets.service.MyScheduleReceiver"
                   android:enabled="true"
                   android:exported="true"
            >
                <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>

还在拔头发吗?

Android 3.1之后 “系统将 FLAG_EXCLUDE_STOPPED_PACKAGES 添加到所有广播意图中。” 这意味着在3.1之后,所有应用程序都会在启动时停止。 为什么?出于安全考虑。

RULES 可以将旗帜关闭“FLAG_EXCLUDE_STOPPED_PACKAGES”。

(1)您的应用需要手机存储,而不是SD卡,否则标志设置。  在挂载外部存储之前发送BOOT_COMPLETE。如果app安装到外部存储器,它将不会收到BOOT_COMPLETE广播消息。

(2)如果用户从设置或“无响应的应用程序”按钮按下“强制关闭”,则设置该标志。

(3)如果应用程序从未运行过,则设置标志(永远不会相对于当前引导状态; O)从不意味着在此引导中或者在上次引导状态中使标志无效)

如果您遵守规则,您的Reciver将在启动时运行(标记未设置)。

<强>信息

您可以在接收代码时注册接收器(启动时无效)。

    IntentFilter filter = new IntentFilter("com.twiggwidgets.service.MyScheduleReceiver");

    MyScheduleReceiver myReceiver = new MyScheduleReceiver();
    registerReceiver(myReceiver, filter);

//receiver's (are supposed to) run momentarily, but you knew that.

测试提示

Open console/terminal and navigating to /platform-tools (it should be in your path ;O)).
Type adb shell or on linux/mac ./adb shell
In the shell type "am broadcast -a android.intent.action.BOOT_COMPLETED"

像魔法一样,你的接收器会运行!。

不是那么容易!

看到android链接: http://developer.android.com/about/versions/android-3.1.html#launchcontrols