当应用程序未运行时,Android广播接收器无法触发的问题

4

根据此指南,我创建了一个接收器,应该在每次插入或拔出充电器时记录电池信息到文件中。该活动读取此文件的内容并将其显示在屏幕上。这应该始终工作,无论运行哪个应用程序,但实际情况并非如此。只有当应用程序处于打开/内存状态时,它才能注册,当我清除内存或重新启动后,它就停止工作了。

清单:

  <receiver android:name=".Receiver">
        <intent-filter>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
        </intent-filter>
    </receiver>

接收器:

public class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
      Intent chargingIntent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
      final int status = chargingIntent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
      int level = chargingIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
      int plugged = chargingIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);
      Battery battery = new Battery();
      battery.setLevel(level);
      battery.setDate(new Date());
      battery.setPlugged(plugged);
      battery.setStatus(status);
      Logger.log(JSON.toJSONString(battery));
    }
}

日志记录器

public class Logger {

public static void log(String text)
{
    File logFile = new File(Environment.getExternalStorageDirectory().getPath()+"/batterylog.txt");
    Log.d("files"," logfile "+logFile+": "+logFile.exists());

    if (!logFile.exists())
    {
        try
        {
            logFile.createNewFile();
            Log.d("files","new logfile created"+logFile);
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    try
    {
        //BufferedWriter for performance, true to set append to file flag
        BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true));
        buf.append(text).append("\r\n");
        buf.flush();
        buf.close();
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

这是在应用程序打开的情况下拔掉电源后的样子: enter image description here 当没有连接时,它就是空的。

您需要注册一个在后台监听此广播的服务。 - ditn
@ditn 我正在按照这个指南操作:https://developer.android.com/training/monitoring-device-state/battery-monitoring.html,它说 BroadcastReceiver 应该能够在应用程序关闭的情况下触发。但事实并非如此? - Asalas77
@AADTechnical 在帖子中添加了日志记录器和截图。 - Asalas77
1
@Asalas77 我注意到这个问题存在于一些设备上。当我尝试在“联想A 600PLUS”上运行我的应用程序时,我遇到了同样的问题,但是在其他设备上,同一个应用程序可以正常运行。 - Rajeev
1
@JithishPN 不是的,我认为这是我的操作系统或设备软件限制,所以暂时搁置了这个应用程序。我正在运行MIUI 8,它是一个相当大量修改过的Android 7版本,很多东西在原生Android上工作方式都不同。 - Asalas77
显示剩余5条评论
2个回答

2
尝试将android:enabled="true"设置为您的接收器。
像这样:
 <receiver android:name=".Receiver"
    android:enabled="true">
        <intent-filter>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
        </intent-filter>
    </receiver>

更新

我刚刚按照你的方法在我的应用程序中实现了它,而且它运行良好。但是我使用了“右键单击->新建->其他->广播接收器”的方式来完成。

在插入intent-filter后,我得到了以下代码:

    <receiver
        android:name=".MyReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
        </intent-filter>
    </receiver>

实际上,它正在调用onReceive方法。


添加了exported属性,但仍然没有任何变化。根据文档看来似乎与此无关。 - Asalas77
尝试使用Android Studio助手再次添加(右键单击文件等)。 - Ekalips
做了那个之后,唯一显著的区别是接收器中有一个空构造函数,但仍然没有变化。在重新启动或从管理器中关闭应用程序后不会触发。 - Asalas77

0

你尝试使用过唤醒锁吗?通常应用程序会在接收到广播时唤醒,但如果它没有唤醒(在某些设备上可能会发生),那么请尝试使用唤醒锁来强制唤醒设备。

如何使用唤醒锁:

//注册唤醒锁

if (mWakeLock == null) {
        PowerManager pm = (PowerManager)yourcontext.getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, yourcontext);
        mWakeLock.setReferenceCounted(false);

}

//使用acquire应用唤醒锁
mWakeLock.acquire();

我应该把这段代码放在哪里?是在我的接收器还是活动中? - Asalas77
广播意图是否已接收?由于广播未被接收,您必须将其放置在活动中。 - Aparna Venkata
这并没有真正帮助,现在是赌运气的。有时候可以工作,大多数情况下不能。 - Asalas77

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接