【问题标题】:Passing a string from an activity to a broadcast receiver将字符串从活动传递到广播接收器
【发布时间】:2012-08-06 23:14:30
【问题描述】:

当应用当前未在屏幕上打开时,我在将字符串从主要活动传递到广播接收器时遇到问题。

创建 MainActivity 类时,intent 过滤器会通过广播接收器返回正确的信息,但是一旦用户在手机上转到主屏幕,当接收器在屏幕外触发时,广播接收器就会开始为 toast 返回“null” .

1.新意图

Intent home_page = new Intent(newIntent.this,MainActivity.class);

 ownAddress  = ""+customInput.getText().toString();
  home_page.putExtra("session_number", ""+ownAddress);

startActivity(home_page);


2. MainActivity.java:

public class MainActivity extends DroidGap {
SmsReceiver mAppReceiver = new SmsReceiver();

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Bundle bundle = getIntent().getExtras();
    final String ownAddress  = bundle.getString("session_number");

    registerReceiver(mAppReceiver, new IntentFilter("SmsReceiver"));
     Intent intent = new Intent("SmsReceiver");
      intent.putExtra("passAddress", ownAddress);
    sendBroadcast(intent);

 }

}


3. SmsReceiver.java:

public class SmsReceiver extends BroadcastReceiver {

 public void onReceive(Context context, Intent intent) {

    Toast showme = Toast.makeText(context,"Number: "+intent.getExtras().get("passAddress"),Toast.LENGTH_LONG);
    showme.show();

 }

}

当应用程序仅在后台运行或无论何时创建 MainActivity 类时,是否有将字符串传递给广播接收器?

【问题讨论】:

  • Activity 实际上是一个 UI 框架。如果它不可见,那么一般来说,它没有运行。解释更多关于你想要做什么,不清楚。
  • 每次触发它时,我都需要将一个字符串从活动传递到广播接收器,因为我正在构建的应用程序将根据字符串的内容执行 HttpPost。
  • 我还是不明白——Activity 不应该被“事件”“触发”,这就是BroadcastReceivers 的全部意义所在。什么是“触发”Activity - 在我看来,您需要绕过“中间人”(Activity),因为您不能保证它会一直运行,因为您的问题显然就是全部关于。 Activity 是一个 UI 框架 - 它不是通用类。

标签: android string broadcastreceiver


【解决方案1】:

我在这里可能错了,但从逻辑上讲,“当接收器在屏幕外触发时,广播接收器开始为 toast 返回“null””的原因是因为您传递给 onReceive 构造函数的上下文在用户时被破坏了转到主屏幕。

我想传递字符串的一种解决方案是在 MainActivity 中创建一个公共静态字符串变量,用于存储要传递的字符串值。然后你所要做的就是在你的 BroadcastReceiver 中静态访问这个字符串。

【讨论】:

  • "...在 MainActivity 中创建一个公共静态字符串变量..." 请不要为 Android Activity 提供此建议。任何扩展 Activity 的类都不应暴露 static 变量或方法。
  • @Squonk 哦,我不知道!我很好奇,我们为什么不这样做?
  • @VishwaPatel :Activity 类不仅仅是任何普通的 Java 类。它是 Android 的基本组件之一,应被视为一种特殊情况。 Activity 只能通过“启动器”进程或其他 Android 组件使用 startActivity(...) 或其他类似方法之一启动。尝试在扩展 Activity 的类上公开 static 变量或方法将失败。
  • @Squonk 感谢您的回复。我仍在尝试了解在什么情况下公开静态字符串变量(或静态位图,因为我在小型个人项目中使用静态位图)会失败?你能举个例子吗?
  • @VishwaPatel : 好吧,也许用会失败这个词是极端的。我的观点是,Android 开发人员不应采取在 Activity 中使用 static 变量或方法的方法,并期望能够从其他应用程序组件中使用它们。 Activity 的生命周期通常是不确定的,Activity 应该是独立的。使用Activity 作为任何static 的占位符违反了Android 设计基础。使用辅助类甚至扩展 Application 来维护全局状态更加健壮。
猜你喜欢
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多