在我的广播接收器中,我正在访问一个方法,该方法调用我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");
}
}
}
答案 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)
这不是直接从接收方调用活动方法的好方法。如果您的活动不可见,但由于收件人的呼叫,应用程序将崩溃,它将尝试执行活动的代码。
您可以在此处使用本地广播。与其从接收方调用活动的方法,不如发送本地广播,您需要在活动中注册,并在本地广播的接收方中注册您的活动方法。仅当您的活动可见并且不会导致应用崩溃时,才会执行从本地广播调用的此方法(活动的方法)。