我正在尝试在我的应用程序中实现一项服务,该服务由一个活动启动。服务如果已启动,它应该在后台运行,直到它被手动停止(由活动)。该服务必须检查每个传入的SMS是否有特殊字符串。如果消息包含字符串,则服务应通过发送另一个SMS(如自动响应系统(ARS))来响应。 第一个问题是服务在ca.之后被系统停止。 60分钟。 此外,如果服务在系统关闭之前运行,则必须在启动后启动该服务。 这是服务的代码: (我很抱歉德语评论。我没时间翻译它们。)
package [...]
import [...]
public class SMSReaderService extends Service {
public static String searchString;
private SMSreceiver mSMSreceiver;
private IntentFilter mIntentFilter;
private static Messenger outMessenger;
private final Messenger inMessenger = new Messenger(new IncomingHandler());
@Override
public void onCreate() {
super.onCreate();
//SMS-received-event receiver
mSMSreceiver = new SMSreceiver();
mIntentFilter = new IntentFilter();
mIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(mSMSreceiver, mIntentFilter);
// Loggen, dass das Objekt erstellt wurde
Log.d("SMSReaderService::Created", "SMSReaderService has been Created.");
}
@Override
public IBinder onBind(Intent intent) {
[...]
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
searchString = (String) intent.getExtras().get("SERCHVALUE");
// Loggen, dass der Service gestartet wurde
Log.d("SMSReaderService::Started", "SMSReaderService has Started.");
return ???;
}
@Override
public void onDestroy() {
// Unregister the SMS receiver
unregisterReceiver(mSMSreceiver);
// Loggen, dass das Objekt zerstört wurde
Log.d("SMSReaderService::Object::Destroyed", "SMSReaderService has been destroyed.");
super.onDestroy();
}
private class SMSreceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent)
{
Bundle extras = intent.getExtras();
if ( extras != null )
{
[...]
}
}
}
}
修改
现在服务返回START_STICKY
。我知道这会奏效。 (实际上确实如此,但是会发生错误)。 1小时后,logcat显示以下信息:
08-03 16:31:29.345: E/AndroidRuntime(9885): java.lang.RuntimeException: Unable to start service de.[...].SMSReaderService@41912c88 with null: java.lang.NullPointerException
08-03 16:31:29.345: E/AndroidRuntime(9885): at de.[...].SMSReaderService.onStartCommand(SMSReaderService.java:161)
08-03 16:32:20.940: E/AndroidRuntime(9933): java.lang.RuntimeException: Unable to start service de.[...].SMSReaderService@41913a30 with null: java.lang.NullPointerException
08-03 16:32:20.940: E/AndroidRuntime(9933): at de.[...].SMSReaderService.onStartCommand(SMSReaderService.java:161)
在“Anwendungsmanager”中(我不知道它是如何用英语调用的...也许类似于“应用程序管理器”)我可以看到服务运行...持续1秒钟。然后它立即停止并尝试重新启动。经过2次尝试后运行。这是logcat记录错误的时候。
第161行:
searchString = (String)intent.getExtras().get(GET_SEARCHSTRING_AFTER_START);
答案 0 :(得分:3)
文档建议您要从onStartCommand()
方法返回Service.START_STICKY
。当资源可用时,如果先前已被运行时杀死,这将再次启动您的服务。
至于在启动时启动服务,您可以创建BroadcastReceiver
来监听运行时发送的system boot intent。当Intent
收到BroadcastReceiver
后,您就可以开始Service
了。如果您只需在设备关闭后启动Service
,则可以执行类似于侦听shutdown intent的操作并保持Service
(运行与否)的状态。
另外需要注意,您需要启用BootCompleted权限。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />