android一个示例同时在onSaveInstanceState和onPause中调用数据保存函数,这是为啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android一个示例同时在onSaveInstanceState和onPause中调用数据保存函数,这是为啥?相关的知识,希望对你有一定的参考价值。

首先我看的是google的官方示例notepad tutorial exercise 3,我认为他们这么做应该是有意义的。
他们在onSaveInstanceState和onPause函数里面都调用了saveNotes()函数,来向数据库中写入当前正在编辑的便签。
那么这么做不会导致我离开程序连续保存了两下么?(如果onSaveInstanceState被调用,那么这俩函数都执行一遍就会保存两次)
在onSaveInstanceState特意保存一下的意义是什么呢?因为我看文档中说1、onSaveInstanceState不能保证被调用,2、只有onPause执行完毕之后程序才是killable,那么我只在onPause中保存便签数据不就好了?为什么还要在onSaveInstanceState中保存一次呢?
补充一下。
google还在后面加上了一句话:
Note that saveState() must be called in both onSaveInstanceState() and onPause() to ensure that the data is saved. This is because there is no guarantee that onSaveInstanceState() will be called and because when it is called, it is called before onPause().
他既然都这么说了。。。还在onSaveInstanceState()中保存干什么。。只在onPause中保存不就好了?

onSaveInstanceState和onPause都写上调用数据保存函数是针对正常和非正常结束activity的场景。
1、onSaveInstanceState:非正常结束,当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用
2、onPause:正常结束,是activity的生命周期一个环节,正常结束都会调用该函数。
参考技术A 在onPause里保存就好。一个activity只要到后台或者被销毁,必须要经过onPause的。追问

我还想请教一个问题:
就是这个示例程序,会在onResume中重新从数据库中读出这条便签,重新对textbox.setText。这么做有什么特殊意义么?
我猜是他们假设有可能在onPause存到数据库之后,数据库里面的条目发生了变化,所以在onResume里面读一下。
但是真的“有可能”会变么?

追答

onSaveInstanceState()只在某些情况下,会被调,这是onPause不会被调,比如系统因为某些原因强制杀死你的activity,这时也许会不经过onPause,但是绝对会调 onSaveInstanceState()。

关于你的第二个问题,你假设的情况也有可能。不过我印象中,常见的变化,比如切出这个页面了,然后切换了系统语言,那么系统会调历史记录里的activity们的onDestroy(),然后又重建页面onStart---onResume(你可以打上LOG跟踪试试),这时页面的某些东西就会不一样了。那么原来保存的那些信息进行重写就有意义了。

追问

原来是这样!高人啊

本回答被提问者采纳

通知示例仅显示在 Android 上收到的最后一个

【中文标题】通知示例仅显示在 Android 上收到的最后一个【英文标题】:Notifications sample only showing the last received on Android 【发布时间】:2014-10-09 13:59:08 【问题描述】:

我正在运行 Worklight 的通知示例。我调用适配器向应用程序发送通知,它将通知完美地显示在顶部栏中。

但是当我发送另一个通知时,它不会与前一个叠加,它会覆盖新的。

而且我不希望它被覆盖。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

这是 Worklight 当前(默认情况下)施加的限制。

本质上,在 Worklight 中,内部有一个 GCMIntentService 类,用于侦听接收到的通知,如果接收到,则创建一个具有静态 ID 的对象并将其发送到操作系统。每次收到通知都会重复此操作,替换之前收到的通知。

你可以做的是:

    提交功能请求以供 Worklight 的产品设计师评估:http://www.ibm.com/developerworks/rfe/

    在您的项目中,android\native\src\com\app-name\GCMIntentService.java 中有一个空类。您可以尝试做的基本上是根据 Google 的文档实现您自己的“推送机制”,以显示所有通知,而不仅仅是最后收到的通知,而不是像当前在 Worklight 中实现的那样使用静态 id。

【讨论】:

【参考方案2】:

您需要在客户端中设置不同的通知 ID。例如,在通知管理器中使用时间戳创建通知 id。

【讨论】:

如何管理通知ID?我拥有的唯一参数是 userId 和 NotificationText。 您需要实现自己的机制来处理推送通知 老兄,这正是我在回答中更详细地写的......并且与用户使用的产品直接相关。

以上是关于android一个示例同时在onSaveInstanceState和onPause中调用数据保存函数,这是为啥?的主要内容,如果未能解决你的问题,请参考以下文章

打开页面默认弹出软键盘,同时兼容iOS和Android

在 Android 中的多个视图上同时处理触摸事件

是否可以同时在iOS和Android模拟器上启用热重新加载?

android 同时setTag两次,保存多种值

使用蓝牙无法同时将超过 4 个从机连接到 master-android

activity的重建