Android:Boot Complete仅在我立即启动App时有效

时间:2015-07-07 02:58:16

标签: android broadcastreceiver startup

我试图在我的应用中重置闹钟并使用接收器来获取onBootCompleted。为了看看是否收到了意图,我正在使用祝酒词。只有在我立即打开应用程序时才会显示Toast。否则,吐司不会出现。我查看了以前的问题,但几乎所有问题都涉及服务,我没有使用。我不确定这是否是问题的一部分。

Android Manifest

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

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<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" >
    <activity
        android:configChanges="orientation|screenSize|keyboardHidden"
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:launchMode="singleTop" >
        <meta-data android:name="android.app.searchable"
            android:resource="@xml/searchable" />

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
</activity>
    <receiver android:name=".AlarmReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.ALARM_SERVICE" />
        </intent-filter>
    </receiver>
    <receiver android:name=".AlarmReset"android:enabled="true" android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>

</application>

接收者类

public class AlarmReset extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent)
{

    Toast.makeText(context, "Hello! Got message",
            Toast.LENGTH_LONG).show();
//reset alarms etc. No service set.
}

我也尝试将清单接收器写为

<receiver android:name=".AlarmReset" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

我在网上找到的关键点是包括权限(我做过)并注意记录。

我不明白的原因是,如果我立即(在几秒钟内,否则吐司没有出现)开始我的活动但其他方法不成功的原因。我正在考虑测试一些可能性,例如通过代码启动活动本身或像大多数其他人一样使用服务。我目前正在使用实际手机在Android 4.4上进行测试。

3 个答案:

答案 0 :(得分:2)

安装应用时,它处于停止状态。在应用程序通过用户启动而移出此状态之前,其任何组件都不会被激活(例如您的BOOT_COMPLETED接收器)。这就是为什么你的应用程序无法启动,除非你启动它。

请注意,强制从“设置”停止应用程序也会将其移至此停止状态。

有关详细信息,请参阅this page(在页面中搜索&#34;启动控件&#34;)。

答案 1 :(得分:2)

从Android 3.1开始,所有应用程序在安装时都处于“已停止”状态。(这与用户从“设置”应用程序强制停止应用程序后应用程序结束的状态相同。)

当处于“已停止”状态时,除了手动启动活动外,应用程序不会以任何理由运行。 (意思是没有BroadcastReceviers(ACTION_PACKAGE_INSTALLED,BOOT_COMPLETED等)将被调用,无论他们注册了什么事件,直到用户手动运行应用程序。)

但你可以为前任开始一个服务 -

1)在你的元素中:

out.channels[i] = scale[i] * in.channels[i] + shift[i]

2)在你的元素中(确保为BroadcastReceiver使用完全限定的[或相对]类名称):

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

在MyBroadcastReceiver.java中:

<receiver android:name="com.example.MyBroadcastReceiver">  
    <intent-filter>  
        <action android:name="android.intent.action.BOOT_COMPLETED" />  
    </intent-filter>  
</receiver>

答案 2 :(得分:1)

我觉得有必要澄清问题和解决方案,因为问题不明确(由于机密性问题)。

我的问题的基本解决方案就是启动服务。

问题:我试图通过AlarmManager在我的班级AlarmReset中发出警报。这本身可能是一个问题,但此外,我试图访问在MainActivity中实例化的对象,进一步加剧了我的困境。我怀疑,当我快速打开MainActivity时它起作用的原因是因为我能够实例化对象并设置类直接访问的先决条件。我认为没有出现的吐司与问题类似。

解决方案:我设置了一个服务类,我指示了AlarmReset。这就是我将AlarmReset类更改为:

public class AlarmReset extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent)
{

    Toast.makeText(context, "Hello! Got message",
            Toast.LENGTH_LONG).show();
//Pretty sure the Toast doesn't appear still. 
    Intent service = new Intent(context, Service.class);
    context.startService(service);
}

然后我的服务类

public class Service extends IntentService {
private DataBaseManager database;

public Service()
{
    super("Service");
}
@Override
protected void onHandleIntent(Intent intent)
{
    database = new DataBaseManager(this);
    Toast.makeText(this, "Hi",
            Toast.LENGTH_LONG).show();

    Toast.makeText(this, "Hello! Got message",
            Toast.LENGTH_LONG).show();
//rest of code
}

同样地,除非我立即在应用程序上(我怀疑它与线程有关),否则文本不会出现。

在这里,我确保在使用它们之前实例化我的对象(或者在崩溃之后这样做)。

其他人可能会遇到的一些问题(正如我所读到的)如下: 在内部存储中安装

  • android:installLocation="internalOnly"

并获得启动权限

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

人们提出并且不是很重要的一些问题是:

  • 使用android:enabled和android:exports。默认值很好
  • 编写完整的接收者名称。对我来说没有必要
  • <action android:name="android.intent.action.QUICKBOOT_POWERON" />似乎没什么用。