2012-10-07 173 views
2

我有下面的代碼這給通過非法參數異常如何在意向登記服務廣播接收器

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()方法中,可能是什麼問題?

+0

你的'IntentService'只會存在幾秒鐘,足夠'onHandleIntent()'執行。恕我直言,從IntentService註冊「BroadcastReceiver」是沒有任何意義的。 – CommonsWare

+0

@CommonsWare嘗試切換到正常服務,廣播接收器現在可以正常工作,但在停止服務時我仍然收到未註冊的接收器錯誤。 – somedev

回答

1

而是在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中使用intent.putExtra()方法,並且遞送BroadcastReceiver

3

您必須通過與registerReceiver()一起使用的unregisterReceiver()中的BroadcastReceiver對象。你不是。請使用您在Service的數據成員中使用registerReceiver()BroadcastReceiver,然後使用unregisterReceiver()的同一對象。

+0

在嘗試這個,現在沒有例外,但現在,沒有烤麪包的短信交付,就好像沒有接收器正在監聽該事件 – somedev

+0

它編譯和運行沒有任何例外,但現在廣播接收器不工作,它看起來像是送貨消防廣播沒有被聽到 – somedev