【问题标题】:String not being set from AlarmReceiver未从 AlarmReceiver 设置字符串
【发布时间】:2023-03-10 16:33:01
【问题描述】:

我有一个闹钟设置,这部分工作正常。收到警报后,我将字符串设置为与警报一起保存的消息。但是当我在 UI 上显示这个字符串时,它没有设置。

这是显示将显示字符串的 UI 的第一个代码:

public class ShowAlm extends Activity {
private static String MessStr="ZZZ";

    public static void setMessStr(String messStr) {
    MessStr = messStr;
}

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.showalm);


        Toast.makeText(this,"Message " + MessStr, Toast.LENGTH_SHORT).show();


    }

然后为了在没有警报的情况下对其进行测试,我在另一个类上放了一个按钮以在上面调用,一切都按预期工作:

btnplot.setOnClickListener(new Button.OnClickListener() {

        @Override
        public void onClick(View v) {
               ShowAlm.setMessStr("AAA");



                Intent intent1 = new Intent(context, ShowAlm.class);
                intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK  | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                context.startActivity(intent1);

            //TestAlarm();
            //Intent intent = new Intent(v.getContext(), AutoComplete4.class);
            //  startActivity(intent);

        }
    });

这就是问题所在,与上面按钮相同的代码但在接收器中不起作用。字符串未设置。

public class AlarmReceiver extends BroadcastReceiver {

    @Override
public void onReceive(Context context, Intent intent) {
  try {
        Bundle bundle = intent.getExtras();
        String message = bundle.getString("alarm_message");

        System.out.println("Message = " + message);

        ShowAlm.setMessStr("AAA");



        Intent intent1 = new Intent(context, ShowAlm.class);
        intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK  | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        context.startActivity(intent1);

   } catch (Exception e) {

   }
}

因此,当显示上面的第二个代码时,MessStr 是默认值。我也尝试将“AAA”编码为字符串,但这没有帮助。

所以最终结果是日志显示字符串在那里,但是当 UI 显示时,字符串是默认的。

想法?

【问题讨论】:

    标签: android parameter-passing


    【解决方案1】:

    我认为问题在于它是一个静态变量。当 Receiver 启动新的 Activity 时,它可能会再次加载该类,静态 var 将被初始化为“ZZZ”。正确的做法是将字符串放入 Intent Extras 中。

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.showalm);
        Intent i = getIntent();
        MessStr = i.getStringExtra("alarmMessage", null);
        if(MessStr != null) {
            Toast.makeText(this,"Message " + MessStr, Toast.LENGTH_SHORT).show();
        }
    }
    
    public void onReceive(Context context, Intent intent) {
      try {
            Intent intent1 = new Intent(context, ShowAlm.class);
            intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK  | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent1.putExtra("alarmMessage", "AAA");
            context.startActivity(intent1);
       } catch (Exception e) {
       }
    }
    

    【讨论】:

    • 效果很好!这就是你应该将变量传递给其他类的方式吗?我这样做的方式似乎一直有效,直到我遇到死胡同时的接收器()
    • 是的,这就是在活动之间传递数据的方式。
    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多