免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1692 | 回复: 0
打印 上一主题 下一主题

google Android activity类 (2) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-07 20:40 |只看该作者 |倒序浏览

startActivity(Intent)
接口用于启动一个新的activity,新的activity将被放置到activity栈顶。使用一个单一的参数:描述activity的执行动作的
Intent

有时候我们希望在activity结束的时候获得activity的反馈结果,例如:在一个activity中,让用户在一个联系人列表中选择某一个人,在该页面结束的时候,能够返回选中的人员信息。要做到这一点,需要调用
startSubActivity(Intent, int)
接口进行启动,第二个参数为调用者的标识。结果将在
onActivityResult(int, int, String, Bundle)
中返回。
当一个activity退出时,可以调用
setResult(int)
返回数据给上一级的activity。它必须支持结果编码,可以是标准的RESULT_CANCELED, RESULT_OK,或者从RESULT_FIRST_USER开始的自定义编码。此外,还可以返回一个字符串(通常是URL的某一项数据),也可以返回一个包含任意内容的包。所有的返回信息都会反馈到上一级的Activity.onActivityResult()接口,并带有上一级activity提供的原始标识号。
如果一个子activity失败了(如崩溃了),父activity将会接收到一个RESULT_CANCELED的结果编码。
public class MyActivity extends Activity
{
...
static final int PICK_CONTACT_REQUEST = 0;
protected boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
// When the user center presses, let them pick a contact.
startSubActivity(
new Intent(Intent.PICK_ACTION,
new ContentURI(”content://contacts”)),
PICK_CONTACT_REQUEST);
return true;
}
return false;
}
protected void onActivityResult(int requestCode, int resultCode,
String data, Bundle extras)
{
if (requestCode == PICK_CONTACT_REQUEST) {
if (resultCode == RESULT_OK) {
// A contact was picked. Here we will just display it
// to the user.
startActivity(new Intent(Intent.VIEW_ACTION, data));
}
}
}
}
保存持久状态
一般来说,activity有两种持久状态需要处理:共享的文档类数据(典型的是使用了
content provider
存储在SQLite中),内在的状态(如用户的嗜好)。
针对内容提供的数据,google建议采用“编辑到位”的用户模型,也就是说,用户的编辑动作是立即有效的,无须进行额外的确认步骤,支持这个模式只需要简单遵守下面的两个规则:
  • 当创建一个新的文档时,相关的数据库条目和文件都是立即创建的,例如:用户选择写一个新的电子邮件,一旦开始写,则新的电子邮件条目创建出来了。所以如果进入其他的activity,则这封电子邮件将会出现在草稿箱中。
  • 当一个activity的onPause()接口被调用时,它应该提交用户的修改到内容提供者或者文件中。这样确保其他将要运行的activity能够看到这些变化。在整个activity的生命周期中,有很多时候都需要频繁提交数据,例如:在启动一个新的activity之前,在结束自己的activity之前,在输入字段进行切换的时候等等。
    这个模型是为了防止用户在activity之间浏览时的数据丢失,允许系统在activity停止后的任何时间里安全地杀掉activity(因为系统资源要用在其他地方)。注意:这样意味着在activity里按了“返回”键并不等于“取消”,它意味着activity的当前数据被保存下来,离开了activity。在一个activity中要取消编辑动作必须有另外一套机制来实现,比如一个清晰的“恢复”或者“撤销”动作。
    可以在
    content package
    里面查看更多的内容提供者信息,有一些重要的方面,在activity调用和activity之间的数据传递的不同。
    activity也提供了一些API用于管理内在的状态,可以用在如浏览器中用户设置的缺省主页等。
    activity的持久状态由
    getPreferences(int)
    来进行管理,允许获取或者修改一套“名字/值”的对。为了在多个应用程序组件(activities, receivers, services, providers)之间共享持久状态,可以使用
    Context.getSharedPreferences()
    接口获取一个共享对象。(注意:不可能跨越应用程序包来共享数据,但是可以使用内容提供者来做)
    下面是一个例子,进行持久性设置:
    public class CalendarActivity extends Activity
    {
    ...
    static final int DAY_VIEW_MODE = 0;
    static final int WEEK_VIEW_MODE = 1;
    private SharedPreferences mPrefs;
    private int mCurViewMode;
    protected void onCreate(Bundle icicle)
    {
    super.onCreate(icicle);
    SharedPreferences mPrefs = getSharedPreferences();
    mCurViewMode = mPrefs.getInt("view_mode" DAY_VIEW_MODE);
    }
    protected void onPause()
    {
    super.onPause();
    SharedPreferences.Editor ed = mPrefs.edit();
    ed.putInt("view_mode", mCurViewMode);
    ed.commit();
    }
    }
    权限许可
    当activity在manifest的

    标签中进行了声明,就有能力进行启动。其他的应用程序为了能够启动这个activity,需要在他们自己的manifest资源文件中的

    元素中进行声明。
    更多的权限和安全问题,可以参见
    Security Model
    文档。
    进程的生命周期
    Android系统试图确保一个应用进程尽可能长久,但是在内存减少的时候最终要删除旧的进程。像
    Activity Lifecycle
    描述的一样,决定哪一个进程被删除是依据于和用户打交道的状态。一般来说,基于运行的activity的进程有四种状态,下面列出了重要的顺序,Android系统在杀掉重要进程之前先杀掉次要的进程。
  • 前台的activity(activity在屏幕的最前面,正和用户进行交互)是最重要的,如果这个activity使用的内存超过了设备提供的内存,作为最后手段才杀掉这个activity的进程。通常在这一点上表明设备已经达到了memory paging state(?),因为需要确保用户界面的交互。
  • 可见的activity(对用户可见,但不是在前台,如位于前台弹出对话框下面的界面)是很重要的,一般不会杀掉这个进程,除非为了确保前台activity的运行不得已而杀之。
  • 后台的activity(对用户不可见,已经暂停)不再重要,系统可以安全杀掉这个进程,回收内存给其他前台或者可见的进程。当用户按下“返回”键浏览这个activity(使它重新在屏幕上可见),它的
    onCreate(Bundle)
    接口将被调用,在暂停的时候由于已经调用过
    onFreeze(Bundle)
    接口重置了状态,因此这个activity能够重新以相同的设置启动。
  • 空进程是没有activity组件和其他应用程序组件(
    Service
    or
    IntentReceiver
    )的进程,在系统内存变低的时候很快就被删除了。出于这个原因,任何在activity之外的后台操作必须在IntentReceiver 或者Service的环境下执行,这样才能确保进程能够一直运行。
    有时候activity希望能够执行一些长时间的操作,自立存在于activity的生命周期之外。例如:相机应用程序允许用户上传一幅图片到网站,上传将花费很长的时间,应用程序应该允许用户离开正在执行的程序。为了完成这些,activity应该启动一个
    Service
    来执行上传任务,在上传区间,系统能够给进程一个良好的优先级别(比那些不可见的进程更高的优先级别),而不用考虑源activity是否处于暂停,停止或者结束状态。


    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/43206/showart_1168422.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP