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