从广播接收器,称为意图时,服务不上手(Intent Service do not get start

2019-11-02 19:18发布

我工作的一个应用程序在其上接收消息,我需要启动服务。 但我的意图服务没有运行。 下面是我在做什么:

广播接收器:

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有人可以帮我解决这个问题?

Answer 1:

我的第一个问题是:你的广播接收器的工作? 正在显示在您的广播接收器的吐司? 第二个问题:你宣布你的意图服务的清单? 你可以这样做以下方式:

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


Answer 2:

唯一的例外,java.lang.InstantiationException确实解决了我的问题。 我错过了一个无参数的公共构造函数。 我刚换

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

成:

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

现在,它的工作真的很好。 希望它可以帮助其他人。



Answer 3:

您应该使用WakefulBroadcastReceiver:

一个WakefulBroadcastReceiver是一种特殊类型的广播接收机的是需要创建和管理你的应用程序的部分唤醒锁的照顾。 它通过清除处理短信到您的ResponseService(IntentService)的工作,同时确保设备不回去睡觉过渡,所以你的意图服务将正常运行。

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


Answer 4:

我以前做过的报警,但你可以很容易忘记沿着你的manifest.xml您wakefulbroadcastreceiver声明。



文章来源: Intent Service do not get started when called from a broadcast receiver