2014-02-24 31 views
1

我做的應用程序,是當收到收到消息字符串特定消息和消息字符串傳遞到上傳信息的方法,並從指定網址獲取數據並回信相同的號碼,但這個應用程序一段時間崩潰,並顯示強制關閉和短信一次又一次地回覆我應該怎麼做,這使得我的應用程序不會一次又一次回覆短信,而不會崩潰。如何防止應用程序崩潰,而不是一次又一次的回覆消息?

Incomingsms.java

public class IncomingSms extends BroadcastReceiver { 
String senderNum; 
String message; 
String url; 
String casetype; 
String no; 
String caseyear; 
String result; 

public void onReceive(Context context, Intent intent) { 

    Bundle myBundle = intent.getExtras(); 
    SmsMessage [] messages = null; 
    String strMessage = ""; 
    String msgFrom = ""; 
    String msgText = ""; 


    if (myBundle != null) 
    { 
     Object [] pdus = (Object[]) myBundle.get("pdus"); 
     messages = new SmsMessage[pdus.length]; 

     for (int i = 0; i < messages.length; i++) 
     { 
      messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
      strMessage += "SMS From: " + messages[i].getOriginatingAddress(); 
      msgFrom += messages[i].getOriginatingAddress(); 
      strMessage += " : "; 
      strMessage += messages[i].getMessageBody(); 
      msgText += messages[i].getMessageBody(); 
      strMessage += "\n"; 

     } 

     Toast.makeText(context, strMessage, Toast.LENGTH_SHORT).show(); 

      try { 

       String regex = "[\\s;.,:'!?()-]"; 
       String text =msgText ; 

       String[] sms = text.split(regex); 
       for(int i = 0; i < sms.length; i++) 
         { 


         casetype = sms[0]; 
         no = sms[1]; 
         caseyear = sms[2]; 

         }   

       } 
       catch (Exception e) 
        { 
       System.out.println(e); 
      Toast.makeText(context, "wrong msg" , Toast.LENGTH_SHORT).show(); 
        } 

     url = "http://www.allahabadhighcourt.in/casestatus/caseDetailA.jsp?type=" + 
      casetype + "&num=" + no + "&year=" + caseyear; 

      try 
      { 
       result = uploadMessage(context,url); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 


      SmsManager sms = SmsManager.getDefault(); 
      sms.sendTextMessage(msgFrom, null, result, null, null); 

    } 

    } 



     public String uploadMessage(Context context, String url) 
    { 

    //System.out.println(url); 
    try{ 
    Document doc = Jsoup.connect(url).timeout(20*1000).get(); 
    if (!doc.hasText()){ 
     System.out.println("doc empty"); 
    } 
    Element pending = doc.select("table td:eq(0)").first(); 
    Element nextDate = doc.select("table td:eq(0)").get(10); 
    //Element date1 = doc.select("table td:eq(0)").get(11); 
    Element date = doc.select("table td:eq(1)").last(); 


    String data = pending.text()+"\n" + nextDate.text()+"\n"+ date.text(); 
    return data ; 
    }catch(Exception ex){ 
     System.out.println("" + ex.getMessage()); 
     return "Nodata" ; 
    } 
    } 
    } 

BroadcastNewSms.java

public class BroadcastNewSms extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.androidexample_broadcast_newsms); 
} 
    } 

Android清單

<uses-permission android:name="android.permission.RECEIVE_SMS" > 

</uses-permission><uses-permission android:name="android.permission.READ_SMS" /> 
<uses-permission android:name="android.permission.SEND_SMS" > 

</uses-permission><uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > 

</uses-permission><uses-permission android:name="android.permission.READ_PHONE_STATE" > 

</uses-permission><receiver android:name="com.androidexample.broadcastreceiver.IncomingSms" > 

    <intent-filter> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter> 

</receiver> 

回答

0

讓你的廣播接收器啓動服務(因爲這是建議。廣播接收機必須是短暫的,他們只是觸發器,你不能讓它們做 太多工作)。

有服務利用的AsyncTask(因爲不使用一個單獨的線程是什麼導致偶爾ANR - 應用程序沒有響應,並在你的情況下,強制關閉)。

+0

請先生詳細講解 – akki

相關問題