如果应用程序已在运行,则仅捕获BOOT_COMPLETED广播(Android模拟器,Lollipop)

时间:2015-08-20 23:11:15

标签: android broadcast boot

请帮我弄清楚为什么我的应用没有收到BOOT_COMPLETED广播消息,除非我的应用已经在运行。

我的目标是让我的应用程序在设备完成启动后自动启动(启动我的GUI)。我的方法是捕获BOOT_COMPLETED广播,然后从onReceive()方法内部启动我的主要活动。

问题是我的应用只捕获BOOT_COMPLETED广播,如果它已经在运行。我期待的是操作系统启动我的应用程序进程并在发送BOOT_COMPLETED广播时调用onReceive()入口点。有人能帮我弄明白我哪里出错了吗?我在想我的错误可能出现在我的AndroidManifest.xml文件中,但我不确定我错过了什么(我的第一个Android项目)

我在Nexus 5上使用Android Studio模拟器,Lollipop。启动时模拟器设置为“不启动活动”,因为这是真正的硬件工作方式。

我正在向这个模拟器发送广播,如果我的应用已经在运行,我会抓住它:

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p com.example.matt.catchbootcompletebroadcast

我的猜测是我的问题出在我的清单文件中,这里是(AndroidManifest.xml):

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.matt.catchbootcompletebroadcast" android:installLocation="internalOnly">

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

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

        <receiver android:name=".BootCompleteReceiver" android:enabled="true" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

这是我的onReceive课程:

    package com.example.matt.catchbootcompletebroadcast;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
import android.util.Log;


/**
 * Created by matt on 8/20/2015.
 * To send broadcast: adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p com.example.matt.catchbootcompletebroadcast
 */
public class BootCompleteReceiver extends BroadcastReceiver
{
    @Override public void onReceive(Context context, Intent intent)
    {
        Log.d("ReceivedABroadcast", "Received A Broadcast");
        if(intent.getAction().equals("android.intent.action.BOOT_COMPLETED"))
        {
            Log.d("ReceivedBootCompleted", "Received BOOT_COMPLETED broadcast");
        }
        // Open the main activity to this application
        Intent startApp = new Intent(context, MainActivity.class);
        context.startActivity(startApp);
    }

}

非常感谢所有提示!

2 个答案:

答案 0 :(得分:2)

一些想法:

尝试在Android设备上启动它。如果这不起作用,请尝试以下操作:在<receiver>标记的Android清单文件中删除enabledexported部分。在Receiver类中删除if语句。

原因:因为您已经过滤了广播接收器收到的意图,if语句几乎没用。如果所有这些都不起作用,这可能会对您有所帮助:Android声明必须以编程方式编写以下操作。我相信该列表包含intent.action.BOOT_COMPLETED所以如果您以编程方式声明接收器,它可能会起作用。对我而言看起来是对的。但我认为这些想法可能值得一试。

答案 1 :(得分:0)

总结上面的所有评论,除​​了我在第一篇文章中的代码,解决方案是:

(1)我只能让我的应用程序在启动时使用真实硬件接收BOOT_COMPLETED广播。也许这可能与模拟器有关,但模拟器对我不起作用 (2)在重新启动之前手动打开应用程序一次。在此之后,应用程序将在每次启动后自动启动。

(3)我的onReceive()必须包含FLAG_ACTIVITY_NEW_TASK标志,否则app会在尝试启动时崩溃。我的onReceive()最终看起来像这样:

    @Override public void onReceive(Context context, Intent intent)
    {
        Log.d("ReceivedABroadcast", "Received A Broadcast");
        if(intent.getAction().equals("android.intent.action.BOOT_COMPLETED"))
        {
            Log.d("ReceivedBootCompleted", "Received BOOT_COMPLETED broadcast");
        }
        // Open the main activity to this application
        Intent startApp = new Intent(context, MainActivity.class);
        startApp.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    
        startApp.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
        context.startActivity(startApp);
    }

感谢大家的帮助!!