从服务调用IntentService是错误的吗?

时间:2014-01-12 16:59:58

标签: android service timer broadcastreceiver intentservice

我有一个在主应用程序启动时启动的服务。我使用此代码调用服务

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可能是问题。 (我之前问了一个类似的问题,但没有回复。这个问题更详细。1https://stackoverflow.com/posts/21057789/edit

由于某种原因,它会挂起,即使是内存或任务管理器也无法停止。物理上点击服务中的“停止”本身什么都不做。

enter image description here

卸载应用程序也不起作用,因为当您运行正在运行的进程时,您会看到一个项目“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>

1 个答案:

答案 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方法()。