通过意图而不是构造函数传递数据

Posted

技术标签:

【中文标题】通过意图而不是构造函数传递数据【英文标题】:Passing data through intents instead of constructors 【发布时间】:2010-11-02 12:53:53 【问题描述】:

开发了许多桌面 GUI 应用程序(从 Xt 到 Qt、Java Awt/Swt/Swing 等),我真的很难适应 android

假设我有 MainView Activity 类,它通过意图机制显式调用DetailedView,如下所示:

由于 Activity 类是通过 onCreate() 实例化的,我该如何 定制它? (没有构造函数,只有 通过意图传递数据!)

有没有办法在 主活动?

有没有办法获取 MainActivity 实例的引用 详细查看?

如何将 FrontEnd 的引用传递给DetailedView 类? Intent.putExtras() 只允许 某些数据类型传递给 意图接收器类。

MainActivity 
    ...
    FrontEnd fe;
    ...

    public void onCreate(Bundle savedInstanceState) 
        ...
        Intent myIntent = new Intent(this, DetailedView.class);
        ...
    

    protected void onListItemClick(ListView l, View v, int position, long id) 
        ...
        startActivityForResult(myIntent,..);
        ...
    

【问题讨论】:

【参考方案1】:

在特定应用的活动/服务之间传递简单数据的一种方法是使用 android 的 SharedPreferences 功能。

这可能不是完成工作的最优雅的代码,但我经常在我的 Android 项目中创建一个静态“实用程序”类,以允许通过共享首选项进行 1 行获取和一组简单数据类型

private static final String PREFERENCE_FILE_NAME = "com.snctln.util.test.SharedPreferencesFile";
private static final String BOOL_VALUE_ONE = "bValueOne";

public static boolean getBooleanValue1(Context context)

    SharedPreferences prefs = context.getSharedPreferences(PREFERENCE_FILE_NAME, Context.MODE_PRIVATE);
    return prefs.getBoolean(BOOL_VALUE_ONE, true); // return true if the value does not exist


public static void setBooleanValue1(Context context, int appWidgetId, boolean actualvalue)

    SharedPreferences.Editor prefs = context.getSharedPreferences(PREFERENCE_FILE_NAME, Context.MODE_PRIVATE).edit();
    prefs.putBoolean(BOOL_VALUE_ONE, actualvalue);
    prefs.commit();

【讨论】:

【参考方案2】:

我经常作弊并使用静态“getInstance”调用在活动和视图之间进行通信。只要它们都在同一个过程中,它就可以工作,而且我还没有出现数据访问失败......但我相信这只是时间问题......如果你正在寻找一个 hacky可以快速解决这个问题,否则您必须通过意图传递数据。

【讨论】:

以上是关于通过意图而不是构造函数传递数据的主要内容,如果未能解决你的问题,请参考以下文章

android 中如何使用intent通过传递变量传递数据

如何通过具有不可序列化数据的意图传递数组或数组列表?

在 R 用户定义函数中传递数据参数

std::thread 通过引用传递调用复制构造函数

angularjs怎么在两个controller之间传递数据

在android中通过意图传递数据