Android - 如何从广播类中的另一个类调用方法?

时间:2012-08-28 02:49:55

标签: android sms broadcastreceiver

在我的代码中,我有一个java文件:

package com.myapp.basic;

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 SMSReceiverActivity extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // Parse the SMS.
        Bundle bundle = intent.getExtras();
        SmsMessage[] msgs = null;
        String str = "";
        if (bundle != null)
        {
            // Retrieve the SMS.
            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]);
                // In case of a particular App / Service.
                //if(msgs[i].getOriginatingAddress().equals("+91XXX"))
                //{
                //str += "SMS from " + msgs[i].getOriginatingAddress();
                //str += " :";
                str += msgs[i].getMessageBody().toString();
                str += "\n";
                //}
            }
            if (str != "") { // remove the last \n
                str = str.substring(0, str.length()-1);
            }

            // Need to find a better way to check if the activity is running
            try {
                ((Police_ViewActivity) context.getApplicationContext()).handle_incoming_help_message(str); // crash here
            } catch(Exception e) {
                System.out.println(e.getMessage());
            }
            System.out.println("ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ");
        }
    }
}

当try块中的代码发生时,它会崩溃并且我收到此错误: 08-27 22:45:11.345:I / System.out(27606):android.app.Application无法强制转换为com.escortme.basic.Police_ViewActivity

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

最好使用Intent来调用活动。你可以这样说:

Intent intent = new Intent(Police_ViewActivity.class);
intent.putExtra("help_message", str);

context.startActivity(intent);

在警察视图活动的onResume()中,抓住额外内容并处理它:

onResume(){
    String msg = getIntent().getStringExtra("help_message");
    if (msg==null) return;
    handleMessage(msg);
}

您不必担心正在创建活动的多个实例,在清单中,您可以使用Launchmode指定活动的启动方式。 singleInstance可能是您的选择。

答案 1 :(得分:0)

如果您只需要在另一个类中调用handle_incoming_help_message方法,只需将handle_incoming_help_message方法设为静态。

update:

所以你应该启动Police_ViewActivity并告诉它你需要调用handle_incoming_help_message

Intent intent = new Intent(context, Police_ViewActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.putExtra("handle_incoming_help_message", str);
context.startActivity(intent);

并在Police_ViewActivity的onCreate(或onResume或Onstart)中

String str = getIntent().getStringExtra("handle_incoming_help_message");
if(str != null)
    handle_incoming_help_message(str);

Update 2

保持警察活动的实例数最多为1? - &GT; Android LaunchMode