我已经搜索了这个问题的解决方案,但我找不到。让我先讨论这个问题。
我有一个使用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);
}
}
请告诉我是否可能导致此问题的原因以及我可以采取的步骤,以便解决此问题。
感谢!!!
编辑: 只是为了加起来,我尝试使用模拟器,但效果很好......
答案 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恢复睡眠之前处理所有活动。因此,如果您确实遇到唤醒问题,这将解决它。