从广播接收器调用时,意图服务不会启动

时间:2014-01-05 18:53:00

标签: android android-intent android-service android-broadcast

我正在开发一个应用程序,在该应用程序中,我需要启动服务才能收到消息。但我的Intent服务没有运行。这就是我在做的事情:

广播接收器:

public void onReceive(Context context, Intent intent) 
{
    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);
    context.startService(in);
}

IntentService:

public class ResponseService extends IntentService 
{
    public ResponseService(String name) 
        {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onHandleIntent(Intent intent) 
        {
        // TODO Auto-generated method stub
        Log.d("Notify", "In Response Service");
        getCurrentLocation();
        }
}

我在日志文件中没有得到任何内容。任何人都可以帮我理解这个问题吗?提前谢谢。

更新的 我已经在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.instantiationexception 有人可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

异常,java.lang.InstantiationException真的解决了我的问题。我错过了一个零参数公共构造函数。我刚刚改变了

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

分为:

public ResponseService() 
        {
        super("ResponseService");
        // TODO Auto-generated constructor stub
    }

现在它的效果非常好。希望它也可以帮助其他人。

答案 2 :(得分:0)

你应该使用WakefulBroadcastReceiver:

WakefulBroadcastReceiver是一种特殊类型的广播接收器,负责为您的应用创建和管理部分唤醒锁定。它将处理SMS的工作传递给您的ResponseService(IntentService),同时确保设备不会在转换中重新进入休眠状态,因此您的Intent服务将正常运行。

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);
    }
}

您的IntentService将如下:

 @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);
    }

答案 3 :(得分:0)

之前我已经完成了警报,但你很容易忘记在manifest.xml中的wakefulbroadcastreceiver上声明它。