Android 从广播接收器调用时,无法启动意图服务

Android 从广播接收器调用时,无法启动意图服务,android,android-intent,android-service,android-broadcast,Android,Android Intent,Android Service,Android Broadcast,我正在开发一个应用程序,在该应用程序中,当收到一条消息时,我需要启动一项服务。但是我的意图服务没有运行。以下是我正在做的: 广播接收机: 我在日志文件里什么都没有。谁能帮我理解这个问题吗?提前谢谢 更新 我已经在manifest.xml中声明了广播接收器和服务,如下所示: <receiver android:name=".BroadCastReceiver" > <intent-filter android:priority="10000" >

我正在开发一个应用程序,在该应用程序中,当收到一条消息时,我需要启动一项服务。但是我的意图服务没有运行。以下是我正在做的:

广播接收机:

我在日志文件里什么都没有。谁能帮我理解这个问题吗?提前谢谢

更新 我已经在manifest.xml中声明了广播接收器和服务,如下所示:

<receiver android:name=".BroadCastReceiver" >
        <intent-filter android:priority="10000" >
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

    <service android:name=".ResponseService" />

此外,我再次尝试运行该应用程序,一段时间后,该应用程序强制关闭,给出了java.lang.InstanceionException
有人能帮我解决这个问题吗?

我的第一个问题是:你的广播接收器工作吗?广播接收器中的祝酒词是否正在显示? 第二个问题:您是否在清单中声明了您的服务意图?您可以通过以下方式执行此操作:

<service android:name="yourPackage.ResponseService" >

异常java.lang.InstanceionException确实解决了我的问题。我缺少一个零参数公共构造函数。我刚换了衣服

public ResponseService(String name) 
        {
        super(name);
        // TODO Auto-generated constructor stub
    }
进入:


现在它工作得很好。希望它也能帮助其他人。

您应该使用WakefulBroadcastReceiver:

WakefulBroadcastReceiver是一种特殊类型的广播接收器,负责为应用程序创建和管理部分唤醒锁。它将处理SMS的工作传递给your ResponseService(IntentService),同时确保设备在转换过程中不会返回睡眠状态,以便Intent Service能够正确运行

public class YourReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Explicitly specify that ResponseService will handle the intent.
        ComponentName comp = new ComponentName(context.getPackageName(),
                ResponseService.class.getName());

        this.con=context;
        Toast.makeText(context,"Broadcast received", Toast.LENGTH_LONG).show();

        Bundle bundle = intent.getExtras();
        Object[] messages = (Object[])bundle.get("pdus");
        SmsMessage[] sms = new SmsMessage[messages.length];

        for(int i=0;i<messages.length;i++)
        {
            sms[i] = SmsMessage.createFromPdu((byte[]) messages[i]);
        }

        String smsFrom = sms[0].getDisplayOriginatingAddress().toString();

        Intent in= new Intent(context, ResponseService.class);
        in.putExtra("sender",smsFrom)
        // Start the service, keeping the device awake while it is launching.
        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
    }
}

我以前做过报警,但是您很容易忘记在manifest.xml中沿wakefulbroadcastreceiver声明它

是的,吐司正在展示,我已经在清单中声明了接收者。接收器工作正常。那么您的意向服务不工作。一定要声明
ResponseService
,就像我在回答中声明的那样。我也声明了。您声明的包正确吗?也许你的
响应服务
在不同的软件包中?不,我的应用程序中只有一个软件包
public ResponseService(String name) 
        {
        super(name);
        // TODO Auto-generated constructor stub
    }
public ResponseService() 
        {
        super("ResponseService");
        // TODO Auto-generated constructor stub
    }
public class YourReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Explicitly specify that ResponseService will handle the intent.
        ComponentName comp = new ComponentName(context.getPackageName(),
                ResponseService.class.getName());

        this.con=context;
        Toast.makeText(context,"Broadcast received", Toast.LENGTH_LONG).show();

        Bundle bundle = intent.getExtras();
        Object[] messages = (Object[])bundle.get("pdus");
        SmsMessage[] sms = new SmsMessage[messages.length];

        for(int i=0;i<messages.length;i++)
        {
            sms[i] = SmsMessage.createFromPdu((byte[]) messages[i]);
        }

        String smsFrom = sms[0].getDisplayOriginatingAddress().toString();

        Intent in= new Intent(context, ResponseService.class);
        in.putExtra("sender",smsFrom)
        // Start the service, keeping the device awake while it is launching.
        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
    }
}
 @Override
    protected void onHandleIntent(Intent intent) {
        Bundle extras = intent.getExtras();


        if (!extras.isEmpty()) {  

            //Do something

        }
        // Release the wake lock provided by the WakefulBroadcastReceiver.
        YourReceiver.completeWakefulIntent(intent);
    }