从广播接收器访问TextViews

时间:2017-01-03 22:06:34

标签: android broadcastreceiver

在我的广播接收器中,我正在访问一个方法,该方法调用我MainActivity类中的另一个方法。我的MainActivity类中的方法使用onCreate()方法中设置的变量。

我遇到的问题是,当应用程序关闭时,当广播接收器尝试访问此方法时,它会发现变量为null,因为onCreate方法没有运行来设置变量。

我应该尝试从广播接收器触发onCreate方法,还是我的整个设置错误?我尝试将代码浓缩一点,所以它不会太长,但在下面你可以看到我试图做的事情的要点。

我得到的错误是" text"和" ringer"尝试setText时为null。仅当应用程序关闭且未运行时广播接收器运行时才会发生这种情况。

WifiScanCompleteReceiver代码:

public class WifiScanCompleteReceiver extends BroadcastReceiver {

        public void onReceive(Context context, Intent intent) {
        ...
        }    
        public static void activate() {
            ...
            MainActivity.statusText();
        }
}

活动代码:

public class MainActivity extends Activity  {

    protected void onCreate(Bundle savedInstanceState) {
            ...

            setContentView(R.layout.activity_main);

            text = (TextView)findViewById(R.id.state);
            ringer = (TextView)findViewById(R.id.mode);
            state = mSettings.getString("state", "init");
            mode = mSettings.getInt("ringer", 0);
            statusText();
    }

    public static void statusText() {
            text.setText(state);
            if (mode == 1) {
                ringer.setText("Vibrate");
            } else if (mode == 2) {
                ringer.setText("Normal");
            } else {
                ringer.setText("Unkown");
            }
        }
}

3 个答案:

答案 0 :(得分:0)

我没有从接收器访问TextView,而是使用CREATE PROC spGetExpectedSalesOrActiveSales @Divisions NVARCHAR(200), @var1 int AS BEGIN DECLARE @QRY VARCHAR(MAX); SELECT @DIVISIONS = REPLACE (@DIVISIONS,' ',''); SELECT @DIVISIONS=''''+REPLACE(@DIVISIONS,',',''',''')+'''' SELECT @QRY = ' SELECT * FROM ABC WHERE x = ''0'' AND z='+@var1 +'AND y IN ('+@DIVISIONS+')' --PRINT @QRY EXEC (@QRY) END 将主活动作为服务触发,这似乎让我得到了我想要的东西。

即使主要活动已经停止,我也需要触发主要活动中的代码才能运行。所以这解决了我的问题。

答案 1 :(得分:0)

您可以使用界面解决此问题: 1)创建一个界面

interface MyListener {
    public void doSomething();
}

2)在BroadcastReceiver中初始化监听器

public class WifiScanCompleteReceiver extends BroadcastReceiver {

    private MyListener listener;

    public void onReceive(Context context, Intent intent) {

          listener = (MyListener)context; 
          listener.doSomething();   // Call interface method

    }         
}

3)在“活动”中实现界面并覆盖方法

public class MainActivity extends Activity  {

      // Your Activity code 

    public static void statusText() {
        text.setText(state);
        if (mode == 1) {
            ringer.setText("Vibrate");
        } else if (mode == 2) {
            ringer.setText("Normal");
        } else {
            ringer.setText("Unkown");
        }
    }

    @Override
    public void doSomething(){
        statusText();
    }

 }

相关链接:

如果您想阅读使用界面Read this的优势

答案 2 :(得分:0)

这不是直接从接收方调用活动方法的好方法。如果您的活动不可见,但由于收件人的呼叫,应用程序将崩溃,它将尝试执行活动的代码。

您可以在此处使用本地广播。与其从接收方调用活动的方法,不如发送本地广播,您需要在活动中注册,并在本地广播的接收方中注册您的活动方法。仅当您的活动可见并且不会导致应用崩溃时,才会执行从本地广播调用的此方法(活动的方法)。