【问题标题】:using SharedPreferences for passing a variable from Receiver to Activity使用 SharedPreferences 将变量从 Receiver 传递到 Activity
【发布时间】:2017-11-06 01:01:29
【问题描述】:

我正在使用 sharedprefs 将变量从接收器传递到活动。 这似乎是正确的,如果我关闭并重新启动应用程序,我可以看到接收器已写入 sharedprefs 并且活动可以读取最后写入的值。 但是当应用程序运行时,变量不会改变。它没有从接收者那里得到值。

这是我从接收者那里收到的代码:

 if (PluginBundleManager.isBundleValid(bundle))
        {
            final String message = bundle.getString(PluginBundleManager.BUNDLE_EXTRA_STRING_MESSAGE);
            SharedPreferences sharedPref = context.getSharedPreferences("MyPrefsFile", Context.MODE_PRIVATE);
            sharedPref.edit().putString("scrltxt", message).apply();
                Toast.makeText(context, message , Toast.LENGTH_LONG).show();
        }

这是来自活动的代码:

public void onResume(){
    super.onResume();
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    final String MY_PREFS_NAME = "MyPrefsFile";
    SharedPreferences sharedPreferencesx = getApplicationContext().getSharedPreferences(MY_PREFS_NAME, Context.MODE_PRIVATE);
    scrltxt = sharedPreferencesx.getString("scrltxt", "");

        Toast.makeText(getApplicationContext(), scrltxt, Toast.LENGTH_LONG).show();

        mEdit   = (EditText)findViewById(R.id.EditText01);
    mEdit.setText(scrltxt);

那么有什么问题吗? 为什么app关闭前receiver不能写?

顺便说一句,我也在同一个应用程序中的单独服务上读取这个共享首选项文件。

【问题讨论】:

    标签: android


    【解决方案1】:

    应用没有更新,因为广播接收到消息时没有调用onResume方法,这是正常的。我认为您正在使用不同的类,因此您需要一个接口。在广播类中定义一个接口:

    public class MyTestReceiver extends BroadcastReceiver 
    {
    Sender sender;
    @Override
    public void onReceive(Context context, Intent intent) 
    {
      if(intent.getAction()=="YourAction")
      {
      sender = (MyActivity) context;
      sender.messageReceived();
      }
    }
    public interface Sender
    {
         void messageReceived();
    }
    
    }
    

    然后在你的活动中实现它:

    MyActivity extends AppCompactActivity implements Sender
    {
    //other methods
    
    @Override
    public void messageReceived()
    {
        // set the text
    }
    
    }
    

    这样,当广播接收到意图时,可以立即更新文本。

    【讨论】:

    • 实际上,我通过手动将其置于前台来使应用程序调用 OnResume。那不应该工作吗?不管怎样,我试过你的方法。但这需要实现 Sender 的活动。我的活动是从活动延伸出来的。 “公共类 FrmActivity 扩展 Activity”。如何将 Sender 添加为工具?
    • @KamunaNakamuna 实现了 MyTestReceiver.Sender。你没有实现的问题,你可以实现无限接口
    • 11-05 00:07:53.520: E/AndroidRuntime(1858): java.lang.RuntimeException: 无法启动接收器 com.aktuna.gear.defilmirz.FireReceiver: java.lang.ClassCastException: android.app.ReceiverRestrictedContext 无法转换为 com.aktuna.gear.defilmirz.FireReceiver$Sender 11-05 00:07:53.520: E/AndroidRuntime(1858): at android.app.ActivityThread.handleReceiver(ActivityThread.java:3369 ) 11-05 00:07:53.520: E/AndroidRuntime(1858): 在 android.app.ActivityThread.-wrap20(ActivityThread.java) 11-05 00:07:53.520: E/AndroidRuntime(1858): 在 android. app.ActivityThread$H.handleMessage(ActivityThread.j
    • 如果我在 messagereceived 上方添加 @Override ,它会显示“- FrmActivity 类型的方法 messageReceived() 必须覆盖超类方法”
    • @KamunaNakamuna 你确定你已经在你的activity中实现了这个接口吗?
    猜你喜欢
    • 1970-01-01
    • 2014-09-14
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多