2012-06-29 96 views
0

調用對象方法,我有這個簡單的SMS監聽器類:無法從廣播聽衆

package net.albanx.smspack; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.telephony.SmsMessage; 
import android.widget.Toast; 



public class ReceiverListener extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     //---get the SMS message passed in--- 
     Bundle bundle = intent.getExtras();   
     SmsMessage[] msgs = null; 
     String str = "";   
     ReceiverActivity addtolist = new ReceiverActivity(); 
     if (bundle != null) 
     { 
      //---retrieve the SMS message received--- 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      msgs = new SmsMessage[pdus.length];    
      for (int i=0; i<msgs.length; i++){ 

       msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);  
       addtolist.addSMS(msgs[i].getOriginatingAddress(), "now", msgs[i].getMessageBody().toString()); 

       str += "SMS from " + msgs[i].getOriginatingAddress();      
       str += " :"; 
       str += msgs[i].getMessageBody().toString(); 
       str += "\n";   
      } 

      Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 
     }      
    } 
} 

我得到當方法

addtolist.addSMS(msgs[i].getOriginatingAddress(), "now", msgs[i].getMessageBody().toString()); 

被稱爲零點execption錯誤。此方法是一個活動的一部分:

public void addSMS(String sms_adress, String sms_date, String message) 
{ 
    LayoutParams lparams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); 
    // from Number label 
    TextView from=new TextView(this); 
    from.setLayoutParams(lparams); 
    from.setBackgroundColor(Color.argb(200, 0, 0, 0)); 
    from.setTextAppearance(getApplicationContext(), R.style.from_style); 
    from.setText(this.getString(R.string.label_from_sms)+":"+ sms_adress); 
    linearLayout.addView(from); 
} 

問題是在該行:

TextView from=new TextView(this); 

在參照該該空。

我想讓一個短信監聽程序,當收到短信它更新我的運行應用程序的短信列表。看來我不能從廣播監聽器調用活動方法。任何人都可以請解釋我該如何解決這個問題?

回答

0

使用新keyword.so如果你想通過從廣播接收到活動的值,然後使用意向值傳遞,因爲你不能實例化一個活動:

通getOriginatingAddress和getMessageBody你的活動爲:

public class ReceiverListener extends BroadcastReceiver 
{ 
List<String> getOriginatingAddresslist = new ArrayList<String>(); 
List<String> getMessageBodylist = new ArrayList<String>(); 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     //---get the SMS message passed in--- 
     Bundle bundle = intent.getExtras();   
     SmsMessage[] msgs = null; 
     String str = "";   
     ReceiverActivity addtolist = new ReceiverActivity(); 
     if (bundle != null) 
     { 
      //---retrieve the SMS message received--- 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      msgs = new SmsMessage[pdus.length];    
      for (int i=0; i<msgs.length; i++){ 

       msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 
       getOriginatingAddresslist.add(msgs[i].getOriginatingAddress()); 
       getMessageBodylist.add(msgs[i].getMessageBody().toString()); 
      } 
     Intent msgIntent = new Intent(context,YourActivity.class); 
     msgIntent.putStringArrayListExtra("getOriginatingAddresslist", getOriginatingAddresslist); 
     msgIntent.putStringArrayListExtra("getMessageBodylist", getMessageBodylist); 
     startActivity(msgIntent); 

,並在活動接收爲:

public class YourActivity extends MapActivity 
{ 
List<String> getOriginatingAddresslist = new ArrayList<String>(); 
List<String> getMessageBodylist = new ArrayList<String>(); 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Intent intent = this.getIntent(); 
     getOriginatingAddresslist = intent.getStringArrayListExtra("getOriginatingAddresslist"); 
     getMessageBodylist = intent.getStringArrayListExtra("getMessageBodylist"); 
     for (int i=0; i<getMessageBodylist.size(); i++){ 

       addSMS(getOriginatingAddresslist.get(i).toString(), "now", getMessageBodylist.get(i).toString()); 

      } 

和處理新的意圖,如果活動已經那麼在運行我們EO nNewIntent (Intent intent)

你也可以使用一個自定義廣播接收器從ReceiverListener在活動收到價值看

Custom Intents and Broadcasting with Receivers

+0

但實際上問題不在這裏,它是從監聽器 – albanx

+0

調用活動的方法你得到了什麼錯誤? –

+0

null點執行取得上下文 – albanx

2

再次我會回答這類問題(並希望我每次都有一美元)...

ReceiverActivity addtolist = new ReceiverActivity(); 

你不能實例化一個Activity使用new

Activity是Android中的一個特例,任何延伸爲Activity的類的新實例只能由Android操作系統本身創建。您絕不應該嘗試從Activity本身之外訪問任何數據成員或Activity的方法。

如果您需要將數據傳遞到Activity,那麼使用startActivity(...)啓動它並通過Intent附加組件傳遞數據。或者,將您的BroadcastReceiver作爲Activity的內部類別嵌套。

+0

謝謝,我只是一個begginer在android但不是在java中,所以我試圖像往常一樣做對象編程。只是一個示例如何使用startActivity(...)或更好的開始活動,如果它尚未開始,我試過但我有一些錯誤。另外我要做第二個選擇。 +1(考慮一個美元) – albanx