我有这个简单的短信监听器类:
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();
}
}
}
当方法
时,我得到一个null point execption错误addtolist.addSMS(msgs[i].getOriginatingAddress(), "now", msgs[i].getMessageBody().toString());
被调用。此方法是活动的一部分:
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);
引用此为null。
我正在尝试创建一个sms监听器,当收到短信时,它会更新正在运行的应用程序的短信列表。似乎我不能从广播监听器调用活动方法。任何人都可以解释一下如何解决这个问题?
答案 0 :(得分:2)
我将再一次回答这类问题(希望我每次都有一美元)......
ReceiverActivity addtolist = new ReceiverActivity();
您无法使用Activity
实例化new
。
Activity
是Android中的一个特例,扩展Activity
的任何类的新实例只能由Android操作系统本身创建。您永远不应尝试从Activity
本身之外访问Activity
的任何数据成员或方法。
如果您需要将数据传递到Activity
,请使用startActivity(...)
启动它,然后通过Intent
个附加内容传递数据。或者,将BroadcastReceiver
嵌套为Activity
的内部类。
答案 1 :(得分:0)
如果要将值从广播接收器传递到Activity,则无法使用new keyword.so实例化Activity。然后使用Intent将值传递为:
将getOriginatingAddress和getMessageBody传递给您的Activity:
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());
}
如果Activity已在运行,则处理新意图,然后使用o nNewIntent (Intent intent)
或
您还可以使用自定义广播接收器在ReceiverListener的Activity中接收值