项目:Activity返回更新问题

来源:互联网 发布:淘宝退款原因质量问题 编辑:程序博客网 时间:2024/06/16 19:14
在做《时光伴侣》的时候遇到了一个问题,简单地描述如下:
首先在AssignDashboard中有一个ListView组件,用于显示日程信息。
当我点击了其中的一个日程的时候,进入该日程浏览,然后点击浏览里的编辑,
可以对日程进行操作。(比如删除和更改都可以)
问题来了,一般我们退出一个活动的时候要使用finish,因为编辑活动和浏览活动中之间频繁切换,
所以,我想只要在浏览活动中点击了返回就直接退到AssignDashboard活动。
所以,我添加了一个活动管理类,当按下浏览的返回时,finish全部浏览和编辑活动。
那么问题来了,那如何通知AssignDashboard更新界面信息呢?
我尝试了以下几种方案:
1.点击浏览的时候将点击的位置传入到浏览和编辑组件,然后更改即可。
    问题是,无法对增加操作进行处理。因为,ListView中是按类别分开的,所以很难确定新增加项的位置。
2.使用广播
    当数据发生变化的时候,就发送一条广播,接收广播的同时更改信息。
    问题是,我们通常使用ListView中传入的Adaper的notifyDataChanged方法来通知更新界面信息,
因为,更新界面信息的时候需要查询数据库,问题来了,数据库是被同步锁的,下面是getReadableDatabase
的定义:
    public SQLiteDatabase getReadableDatabase() {
        synchronized (this) {
            return getDatabaseLocked(false);
        }
    }
根据GoodleDoc的解释,创建了的数据库是被缓存了的,所以无法再次打开数据库。这样,我们就无法查询
新增加了哪些数据。准确地说是被缓存了,因为更改日程的内容的时候确实可以在AssignDashboard中被
查询出来,但是无法获取新添加的数据。
3.使用Intent返回
    我想到的最后一种方案就是使用Intent和startActivity方法返回,这样上面的finish全部编辑和浏览
活动也都没必要了,只要使用Intent返回,并将AssignDashboard活动的launchMode设置为singleTop,
这样每次从浏览或者编辑返回的时候就会销毁原来的活动,重新打开一个活动,再查询数据库即可。
然而,测试了一段时间,开始没有发现错误,因为一直都是按界面的按钮操作的,知道按下back键的时候,
发现了问题——设置launchMode为singleTask的时候会返回到原来的活动,那么要实现重新加载就无效了。
而singleTop就是指最顶层仅仅存在一个,根本没有设置的必要。(因为只可能存在一个)所以,现在只好
结合finish的活动管理来完成了。其实前面的思路没有什么问题,只是实际上,活动在栈里也是不断增加的,
问题只在当处在AssignDashboard活动的时候,如何销毁全部活动并直接返回到MainActivity的问题。
这我们就可以借助ActivityManager的finish活动,将于日程相关的活动全部销毁即可。
4.上述使用Intent返回也并非一个非常好的方案,因为,其实使用Intent返回每次也一样要重新加载数据。
注意到在Activity的生命周期中有一个方法叫onRestart,只在活动从其他活动中返回的时候调用。我们可
以在活动中定义加载数据的方法,然后每次onRestart的时候调用这些方法即可。



0 0
原创粉丝点击