[英]how to register broadcast receiver in intent service
我有以下代码,该代码使接收者未通过非法参数异常进行注册
public class CheckServer extends IntentService
{
public String snumber;
public CheckServer()
{
super("CheckServer");
}
@Override
public void onCreate()
{
super.onCreate();
String DELIVERED = "SMS_DELIVERED";
DeliveryReceiver dReceiver = new DeliveryReceiver();
registerReceiver(dReceiver,new IntentFilter(DELIVERED));
}
@Override
public void onDestroy()
{
super.onDestroy();
DeliveryReceiver dReceiver = new DeliveryReceiver();
unregisterReceiver(dReceiver);
dReceiver = null;
}
@Override
protected void onHandleIntent(Intent intent)
{
try
{
serviceAction();
}
catch (ClientProtocolException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (URISyntaxException e)
{
e.printStackTrace();
}
catch (JSONException e)
{
e.printStackTrace();
}
scheduleNextUpdate();
}
private void scheduleNextUpdate()
{
Intent intent = new Intent(this, this.getClass());
PendingIntent pendingIntent =
PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
long currentTimeMillis = System.currentTimeMillis();
long nextUpdateTimeMillis = currentTimeMillis + 1 * DateUtils.MINUTE_IN_MILLIS;
Time nextUpdateTime = new Time();
nextUpdateTime.set(nextUpdateTimeMillis);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, nextUpdateTimeMillis, pendingIntent);
}
public void serviceAction() throws ClientProtocolException, IOException, URISyntaxException, JSONException
{
HttpResponse response = null;
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI("http://www.examplecom/sms/getsms"));
response = client.execute(request);
String result = convertStreamToString(response.getEntity().getContent());
String no,message;
JSONArray array = new JSONArray(result);
for (int i = 0; i < array.length(); i++)
{
JSONObject row = array.getJSONObject(i);
snumber = row.getString("sno");
no = row.getString("no");
message = row.getString("message");
sendSMS(no , message);
}
}
public static String convertStreamToString(InputStream inputStream) throws IOException
{
if (inputStream != null)
{
Writer writer = new StringWriter();
char[] buffer = new char[1024];
try
{
Reader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"),1024);
int n;
while ((n = reader.read(buffer)) != -1)
{
writer.write(buffer, 0, n);
}
}
finally
{
inputStream.close();
}
return writer.toString();
}
else
{
return "";
}
}
public void sendSMS(String number,String message)
{
String DELIVERED = "SMS_DELIVERED";
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
SmsManager smsM = SmsManager.getDefault();
smsM.sendTextMessage(number, null, message, null, deliveredPI);
}
public class DeliveryReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent arg1)
{
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS delivered",Toast.LENGTH_SHORT).show();
try
{
updateSMSstatus(snumber);
}
catch (ClientProtocolException e)
{
e.printStackTrace();
}
catch (URISyntaxException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS not delivered",Toast.LENGTH_SHORT).show();
break;
}
}
public void updateSMSstatus(String sno) throws URISyntaxException, ClientProtocolException, IOException
{
HttpResponse response = null;
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI("http://www.example.com/sms/updatesmsstatus?uname=someone&sno="+sno));
response = client.execute(request);
}
}
问题是即使我在onCreate()方法中注册,我也收到未收到注册错误,这可能是什么问题?
您必须在与registerReceiver()
一起使用的unregisterReceiver()
中传递相同的BroadcastReceiver
对象。 你不是。 请守住BroadcastReceiver
,你所使用registerReceiver()
在你的数据成员Service
,然后使用相同的对象与unregisterReceiver()
而不是在onCreate()
注册和在onDestroy()
方法中注销,我将sendSMS
方法更改为以下内容:
public void sendSMS(String number,String message,String serialnum)
{
String DELIVERED = "SMS_DELIVERED";
Intent delivered = new Intent(DELIVERED);
delivered.putExtra("MsgNum", serialnum);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, delivered, 0);
registerReceiver(
new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS delivered",Toast.LENGTH_SHORT).show();
updateSMSStatus USS = new updateSMSStatus();
USS.execute(intent.getStringExtra("Msgnum"));
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS not delivered",Toast.LENGTH_SHORT).show();
break;
}
unregisterReceiver(this);
}
},
new IntentFilter(DELIVERED));
SmsManager smsMngr = SmsManager.getDefault();
smsMngr.sendTextMessage(number, null, message, null, deliveredPI);
}
谢谢您,现在已触发短信发送操作。
关于如何区分每个短信的发送报告有什么想法?
我不太确定如何在service
使用带有交付的BroadcastReceiver
的intent.putExtra()
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.