我正在开发一个应用程序,在该应用程序中,我需要启动服务才能收到消息。但我的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 有人可以帮我解决这个问题吗?
答案 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上声明它。