在android中保持两个活动之间的数据更新

时间:2013-05-05 03:20:18

标签: java android

如何在两个Android活动之间保持数据更新。我正在开发一个Android专辑项目,其中主要活动是专辑活动(我可以在其中添加删除和重命名专辑)。但是,当用户点击刚刚创建的其中一个专辑时,我会启动一个带有照片活动的意图,他可以在其中添加删除和移动照片。所有操作都是在光活性中为相册完成的,我使用序列化将数据写回两个活动中的文本文件。问题是当我从照片活动中回到主要活动时对特定专辑进行一些更改。主要活动不了解更新。

主要活动中的代码,用于启动用户选择的特定相册上的照片意图

albumGridView.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

                //Toast.makeText(MainActivity.this, "" + position, Toast.LENGTH_SHORT).show();

                Intent photoIntent = new Intent(MainActivity.this, Photo.class);
                photoIntent.putExtra("userNode", user);

                photoIntent.putExtra("position", position);
                startActivity(photoIntent);

            //  Toast.makeText(MainActivity.this, position, Toast.LENGTH_SHORT).show();
            }

        });

您看到我传入了用户对象,该用户对象是已添加删除或移动的所有相册和照片节点的链接列表。它基本上是该用户的整个用户数据。所以每当我开始将用户节点的旧引用传递给照片意图。我已经使用序列化实现了readerUser()和writeUser方法。我需要在主活动中保持用户对象的引用,并更新照片活动中的所有更改。

5 个答案:

答案 0 :(得分:1)

使用contentProvider提供对照片数据的唯一访问权限并实施Observer设计模式。也就是说,在ContentProvider内部,当数据集由于insertupdatedelete而更改时,请通知contentResolver;另一方面,用户必须通过调用getContentResolover().registerContentObserver

来注册通知

查看这些链接:

http://developer.android.com/reference/android/content/ContentProvider.html http://developer.android.com/reference/android/content/ContentResolver.html http://mylifewithandroid.blogspot.com/2008/03/observing-content.html

答案 1 :(得分:0)

了解如何实施Android应用程序。 Application类本质上为您提供了一个无GUI的活动,该活动在会话期间保持不变。您可以只调用Application上的方法将图像保存到Application中的数据结构,而不是序列化对象(缓慢,过多的开销)。

使用应用程序意味着您的任何常规活动都可以获取对应用程序单例的引用,并访问您公开的任何字段或方法。

阅读官方doc并在谷歌搜索一些实施示例,其中有很多。

答案 2 :(得分:0)

我认为你需要的是数据库。使用sqlite http://developer.android.com/reference/android/database/sqlite/package-summary.html

猜测您还希望在第二次运行应用程序时保留并恢复数据。

答案 3 :(得分:0)

答案 4 :(得分:0)

我用@Vegito1044在主Activity中提出了一个本地的BroadcastReceiver,可以从其他活动中触发。相关代码如下所示:

public class AlbumActivity extends Activity {
    private BroadcastReceiver myReceiver = null;

    class _AlbumUpdateReceiver extends BroadcastReceiver {
        @Override
        public void onReceive (Context context, Intent intent) {
            Log.i(Global.LOG_CONTEXT, "AlbumActivity.onReceive(intent='" + intent + "')");
            reloadGui();
        }
    }

    @Override
    public void onResume() {
        super.onResume();

        if (myReceiver == null)
        {
            myReceiver = new _AlbumUpdateReceiver();
            IntentFilter filter = new IntentFilter(Global.REFRESH_GUI);
            registerReceiver(myReceiver, filter);
        }

        reloadGui();
    }

    @Override
    public void onPause() {

        if (myReceiver != null)
        {
            unregisterReceiver(myReceiver);
            myReceiver = null;
        }

        super.onPause();
    }

    void reloadGui()
    {
        Log.d(Global.LOG_CONTEXT, "AlbumActivity.refreshGui()");
        ... do what is neccessary to update gui
    }
}