请帮我弄清楚为什么我的应用没有收到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);
}
}
非常感谢所有提示!
答案 0 :(得分:2)
一些想法:
尝试在Android设备上启动它。如果这不起作用,请尝试以下操作:在<receiver>
标记的Android清单文件中删除enabled
和exported
部分。在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);
}
感谢大家的帮助!!