【问题标题】:BroadcastReceiver stops working after few hours the phone was lockedBroadcastReceiver 在手机被锁定几个小时后停止工作
【发布时间】:2014-01-12 23:54:53
【问题描述】:

我已经搜索过此问题的解决方案,但找不到。让我先讨论一下这个问题。

我有一个使用 Intellij 创建的广播接收器。在 intellij 中,使用 run 命令将 APK 加载到运行 android 2.2.1 的手机上。起初广播接收器工作良好,但当手机锁定时,几个小时后广播接收器似乎停止工作。

我想我已经配置了我的 androidmanifest.xml 并且代码也可以,因为它在手机锁定之前和手机解锁时都可以工作。

不管怎样,下面是这个涉及代码的sn-p。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.sample.smsapp"
      android:versionCode="1"
      android:versionName="1.0">
<uses-sdk android:minSdkVersion="8"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS" />

<application android:label="@string/app_name">
    <receiver android:name=".SmsReceiver"
            android:enabled="true"
            android:exported="true">
        <intent-filter android:priority="1000">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
    <activity android:name=".SMSApp"
              android:label="@string/app_name">
        <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.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>
</manifest> 

这里是广播接收器sn-p:

public class SmsReceiver extends BroadcastReceiver {
final SmsManager sms = SmsManager.getDefault();

@Override
public void onReceive(Context context, Intent intent) {
    String textMessage = getReceivedMessage(context, intent);


    SharedPreferences pref = context.getSharedPreferences("smsapp", context.MODE_PRIVATE);

        try {
            GMailSender sender = new GMailSender("test@email.com", "pass");
            sender.sendMail("New Message Received",
                    getReceivedMessage(context, intent),
                    "test@email.com",
                    "recvr@email.com");
        } catch (Exception e) {
            Log.e("SendMail", e.getMessage(), e);
        }
}

}

公共类 SMSApp 扩展 Activity {

/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

}

请告诉我此问题的可能原因以及我可能采取的步骤,以便解决此问题。

谢谢!!!

编辑: 只是为了加起来,我尝试使用模拟器,但效果很好......

【问题讨论】:

    标签: android broadcastreceiver


    【解决方案1】:

    您可以尝试使用 Asynctask() doinBackground() 函数将代码逻辑置于后台。

    【讨论】:

    • 这已经在广播接收器上订阅,当新的 SMS 消息到达时,它会被调用,就像手机上的默认 SMS 应用程序一样。
    【解决方案2】:

    可能发生的情况是,由于手机已锁定一段时间,它已进入深度睡眠模式并且 cpu 已关闭。如果您需要它保持活跃,您可能需要考虑使用WakeLock

    请注意,由于这会阻止 CPU 关闭,因此会导致更快的电池消耗。因此,无论是否启用,您都可以将其设为用户选项。

    您可以在未来做一些工作而不需要 WakeLock 的另一种可能性是使用AlarmManager,但这只有在您想在未来某个已知时间做某事时才有用。

    【讨论】:

    • 我只是想知道,为什么手机上的默认短信应用程序在它处于睡眠状态时工作,其中这个应用程序还订阅广播接收器。
    • 现在我想多了,我认为这不会是 WakeLock 问题,因为系统正在触发事件。如果您自己的应用程序是事件的来源,那么它可能需要一个 WakeLock,但在这种情况下,它可能是别的东西。
    【解决方案3】:

    我不认为WakeLocks 是答案。我经常使用BroadcastReceivers 来接收系统广播的 Intent,从来没有遇到过这个问题。

    不确定这是否是您的问题,但请参阅来自IntentFilter documentation 的这个 sn-p

    该值必须是整数,例如“100”。数字越大优先级越高。默认值为 0。该值必须大于 -1000 且小于 1000。

    那么,如果你试试 999,也许看看会发生什么?

    编辑:或者,您是否查看过WakefulBroadcastReceivers?这将BroadcastReceiver 与部分唤醒锁相结合,以确保在 CPU 重新进入睡眠状态之前处理您的所有活动。因此,如果您实际上遇到了唤醒锁问题,这将解决它。

    【讨论】:

    • 我尝试将其设置为 999,但它仍然无法在锁定的情况下工作...
    • 嗯,我会继续尝试,但除非您可以发布更多代码或 logcat 日志(在 onReceive() 中添加额外的日志记录),否则我看不到其他任何内容......另外,您似乎缺少开头的 &lt;application&gt; 标记,这是在您的项目中,还是只是复制/粘贴错误?
    • 根据文档,此类 wakefulBroadcastReceivers 自 26.1.0 起已弃用。
    猜你喜欢
    • 2018-12-19
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多