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();
        }                       
    }
}

メソッドを実行すると、nullポイントの実行エラーが発生します

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が受信されると、実行中のアプリのSMSのリストを更新するSMSリスナーを作成しようとしています。ブロードキャストリスナーからアクティビティメソッドを呼び出せないようです。誰かがこの問題を解決する方法を説明できますか?

4

2 に答える 2

2

もう一度、この種の質問に答えます (そして、私が持っているたびにドルがあればいいのにと思います)...

ReceiverActivity addtolist = new ReceiverActivity();

Activityusing をインスタンス化することはできませんnew

ActivityAndroid では特殊なケースであり、拡張するクラスの新しいインスタンスはActivity、Android OS 自体によってのみ作成できます。Activity外部からのデータ メンバーまたはメソッドにアクセスしようとしないでくださいActivity

にデータを渡す必要がある場合はActivity、それを使用して開始し、extrasstartActivity(...)を介してデータを渡します。Intentまたは、 yourBroadcastReceiverを の内部クラスとしてネストしますActivity

于 2012-06-29T23:24:37.997 に答える
0

新しいキーワードを使用してアクティビティをインスタンス化することはできません。したがって、ブロードキャストレシーバーからアクティビティに値を渡したい場合は、インテントを使用して値を次のように渡します。

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());

            }

アクティビティがすでに実行されている場合に新しいインテントを処理するには、o nNewIntent(インテントインテント)を使用します

また

また、ReceiverListenerからActivityの値を受信するためにカスタムブロードキャストレシーバーを使用することもできます。を参照してください。

カスタムインテントとレシーバーを使用したブロードキャスト

于 2012-06-29T23:12:18.647 に答える