几个小时后手机被锁定,BroadcastReceiver停止工作

时间:2014-01-12 23:54:53

标签: android broadcastreceiver

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

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

我想我已经配置了我的androidmanifest.xml并且代码也没关系,因为它在手机锁定和手机解锁之前正常工作。

无论如何,下面是涉及此代码的代码段。

<?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> 

这是广播接收器片段:

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扩展了活动{

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

}

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

感谢!!!

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

你可以在未来需要WakeLock的情况下进行一些工作的另一种可能性是使用AlarmManager,但这只有在你想在将来的某个时间做某事时才有用。

答案 2 :(得分:0)

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

不确定这是否是您的问题,但请参阅IntentFilter documentation

中的此片段
  

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

所以也许看看如果你试试999会发生什么?

编辑:或者,你看过WakefulBroadcastReceivers吗?这将BroadcastReceiver与部分唤醒锁相结合,以确保在CPU恢复睡眠之前处理所有活动。因此,如果您确实遇到唤醒问题,这将解决它。