我有一个在主应用程序启动时启动的服务。我使用此代码调用服务
Intent serviceIntent = new Intent(this, SMS_Listener_Service.class);
startService(serviceIntent);
服务本身具有以下主要值得注意的代码
public class SMS_Listener_Service extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
if (!blnAutoSyncisEnabled) {
stopSelf();
return 0;
} else {
return START_STICKY;
}
private class MyContentObserver extends ContentObserver {
public MyContentObserver() {
super(null);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
//pause for 3 seconds and see if the counter changes.
if it goes past 5 transactions then start processing and start a timer
TaskToRunAfter3Seconds();
intTimesCalled = intTimesCalled + 1;
}
}
}
private void TaskToRunAfter3Seconds() {
try {
//calls the ReadTrandactions intentService that parses sms messages
Intent intent = new Intent(context, ReadTransactionsForSERVICE.class);
startService(intent);
} catch (NumberFormatException e) {
BugSenseHandler.sendException(e);
}
}
}
然后我们有一个被调用的intent Service,我在其中处理OnHandleIntent方法
中的工作public class ReadTransactionsForSERVICE extends IntentService {
public ReadTransactionsForSERVICE() {
super("ReadTransactionsForSERVICE");
}
protected void onHandleIntent(Intent intent) {
//Initialize stuff
try {
//do the main work here.
} catch (Exception e) {
BugSenseHandler.sendException(e);
return;
}
}
}
我的问题是,我的实施是否合理?即可以从服务中的BroadcastReceiver调用IntentService吗?
我问这个是因为,我的服务以最奇怪的方式挂起,我怀疑从服务调用的IntentService可能是问题。 (我之前问了一个类似的问题,但没有回复。这个问题更详细。1:https://stackoverflow.com/posts/21057789/edit)
由于某种原因,它会挂起,即使是内存或任务管理器也无法停止。物理上点击服务中的“停止”本身什么都不做。
卸载应用程序也不起作用,因为当您运行正在运行的进程时,您会看到一个项目“Unknown process ..... restarting”,如果您尝试kill,那么应用程序管理器会生成错误,即“设置已停止” “但是在返回时,未知进程仍然存在。
如果您在显示上述内容后再次安装应用程序,则该服务永远不会启动。它再次保持在“重启”模式。 唯一的办法是重启电话本身。 (冷启动)
以上仅在Android 4.3及以上版本中观察到。较低的版本似乎没有这个问题。
感谢并期待一些帮助。
我根据场景从3点调用服务。首先是应用程序启动我检查服务是否已启动,如果不是,我启动它。
其次来自BroadcastReceiver
public class SMSNotifyStarter extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, SMS_Listener_Service.class);
context.startService(service);
//(this,"Boot Complete Recieved and Service Started.");
}
}
最后来自网络状态的变化。即如果新的互联网连接处于活动状态(Wifi或移动),我会检查新的交易。代码在这里
public class NetworkChangeReceiver extends BroadcastReceiver {
Context ctx;
@Override
public void onReceive(final Context context, final Intent intent) {
ctx = context;
int status = NetworkUtil.getConnectivityStatusString(context);
if (status == 1 || status == 2) { //means wifi or mobile is active
blnSyncAllowed = GSR.ReadSharedPreferencesBool(ctx,
GSR.PrefsFileName,"SYNC_ALLOWED", true);
if (blnSyncAllowed)) {
Intent intentx = new Intent(context, ReadTransactionsForSERVICE.class);
intentx.putExtra("CalledByWakeOnConnectionFound", "WakeOnConnectionFound");
context.startService(intentx);
}
}
//Toast.makeText(context, status, Toast.LENGTH_LONG).show();
}
}
清单条目
<receiver
android:name="com.myappName.NetworkChangeReceiver"
android:label="NetworkChangeReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
<receiver android:name="com.myappName.SMSNotifyStarter">
<intent-filter>
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service
android:name="com.myappName.SMS_Listener_Service"
android:enabled="true"
android:icon="@drawable/myAppIcon"
android:label="myAppManager">
<intent-filter>
<action android:name="com.myappName.SMS_Listener_Service" />
</intent-filter>
</service>
<service android:name="myappName.ReadTransactionsForSERVICE">
</service>
答案 0 :(得分:0)
我会问这个评论,但我刚刚开始。您是否在清单中注册了广播接收器和服务?
对于service / intentservice:
<service
android:name="your service path"
android:exported="false" > <!--if you only want to call it from within your app-->
</service>
对于广播接收器:
<receiver android:name="your receiver path"
android:exported="false" <!--if you only want to call it from within your app-->
<intent-filter>
<action android:name="the action you're sending" />
</intent-filter>
</receiver>
此外,我不确定你是如何在意图服务中过滤你的意图,因为你没有在意图中采取行动。
intent.setAction("action");
然后你可以在onHandleIntent()方法中查找这个动作。我想如果你只有一个意图就没关系,但除此之外,我建议你也加入这个意图。请在代码中放置调试点,看看你是否也到达了onHandleIntent方法()。