android activity怎么利用activity的活动状态来自动刷新数据

Android笔记:关于Activity应用
Android笔记:关于Activity应用
导读:Activity是一个可以提供用户一个屏幕让用户可以来做某些交互的应用组件,比如拨打电话,拍照,发email或者查看地图。每个activity会给出一个窗口来绘制用户界面。这个窗口通常会填满整个屏幕,但有时也会比屏幕小点并且浮动在其他屏幕的顶端。
  【】Activity是一个可以提供用户一个屏幕让用户可以来做某些交互的应用组件,比如拨打电话,拍照,发email或者查看地图。每个activity会给出一个窗口来绘制用户界面。这个窗口通常会填满整个屏幕,但有时也会比屏幕小点并且浮动在其他屏幕的顶端。
  1. Activity栈, 在Activity中可以启动新的Activity, 当新的Activity启动后, 前一Activity被停止, 并保存在Activity栈。当前Activity被压入栈顶。
  2. 创建Activity。需要继承Activity, 并实现一系列的回调方法。两个重要的方法是
  a. onCreate(), 当系统创建当前Activity时会调用这个方法,在你的实现中,你应该初始化一些你的Activity的必要组件, 最重要的是,你必须调用setContentView()来来指定你的Activity的用户界面布局。
  b. onPause(), 系统会在用户要离开(并不一定总是destroy)Activity的第一意向是调用这个方法。通常这是我们需要提交一些用户会话中需要保存的改变(因为用户可能再也不会回来)的时机; 这个方法是最后一个可以保证在进程被kill 之前调用,因此需要在这个方法里面存储至关重要的数据,而且这些操作必须是轻量级的, 不然会阻塞下一个Activity的转换进而影响用户的体验。
  3. 几个Activity的子类:
  a. ListActivity:含有ListView的Activity
  b. TabActivity:提供支持用户Tab切换的Activity
  c. PreferenceActivity:显式层级的preference的Activity
  4. 必须在manifest文件中声明Activity,如果Activity不需要在其它应用中激活,则不需要提供intent filter, 只能通过显式的intent来启动。反之则需要提供intent filter,可以通过隐式intent 启动,也可以通过设置:exported 属性为false来使你的Activity为private的。
  5. 启动有返回结果的Activity,startActivityForResult(), 需要实现onActivityResult()回调方法。当启动的Activity退出(finish)后系统会调用这个方法。
  6. 结束Activity,finish()停止自己或finishActivity()来停止一个先前启动的Activity。由于系统自动管理了Activity的生命周期,所以大多数情况下,你没必要显式的调用这些结束方法来停止Activity, 这可能不利于用户体验。
  7. Activity生命周期. Activity在本质上存在于三种状态
  a. Resumed, Activity在前台并且有用户焦点, 通常也叫运行状态。
  b. Paused, 另一个Activity在前台并拥有焦点,但它还是可见的。也就是说当前拥有焦点的Activity是半透明或者是部分覆盖屏幕的。处在这种状态的Activity是完全存活的(在内存中并和window manager连接), 但是系统会在内存极其低下时将其Kill
  c. Stopped, 这个Activity完全被其它Activity覆盖(在后台),处在这种状态的Activity也可以是存活的(在内存中但不与window manager连接), 当不可见或系统内存低时会被Kill
  Paused或Stopped状态的Activity可被系统Kill, 不过仍然通过请求finish()方法。
  8. Activity生命周期的回调方法。
  a. 启动相关方法,onCreate(),onStart(),onRestart(),onResume(), 这些方法之后Activity的宿主进程一般不会杀掉, 除非在没有任何资源的紧急情况下; 结束相关方法onPause(),onStop(),onDestroy(),这些方法之后Activity的宿主进程可以被杀掉。
  b. 所有对这些回调方法的实现必须在做任何事情之前调用super的相关方法。
  c. 这些回调方法, 可以监控Activity生命周期中的三个嵌套循环。
  d. 完整的生命周期: 在onCreate()和onDestroy()之间发生,应该在onCreate()中初始化资源和状态,如设置View, 在onDestroy()中释放所有残存的资源。 如Activity需要一个线程, 则应在onCreate()中启动线程,而在onDestroy()中结束线程()。
  e. 可视生命周期:在onStart()和onStop()之间发生,在这期间用户可以在屏幕上看到这个Activity。在这期间可以维护需要展示给用户显式的资源。如在onStart()中注册BroadcastReciver来接收影响用户UI的改变,并在onStop()中注销掉。
  f. 前台生命周期:在onResume()和onPause()之间, 在这期间其在所有Activity前面并且拥有用户的输入焦点, 这个状态转换比较频繁,里面的操作应该轻量级。
  9. 保存Activity的状态, 生命周期中的回调方法可以在Activity对象没有被销毁时保留Activity的状态,但是当Activity对象被系统销毁后,当回到这个Activity时不能简单的start这个Activity,而需要重新创建。 但是用户并不知道这个Activity被销毁并重新创建了它,用户希望回到之前的样子。 这就需要另一个回调方法onSaveInstanceState()来保存Activity的状态信息。
  10. onSaveInstanceState()会传递你一个Bundle对象,你可以把你需要保存的信息存放在里面, 当系统杀掉了你的Activity所在的进程并且用户又返回到你的Activity时, 这时就会把这个Bundle对象传到onCreate()和onRestoreInstanceState()方法, 并利用它来恢复Activity的状态, 如果没有状态信息储存, 则Bundle对象为空。Activity在每次销毁之前onSaveInstanceState()并不一定都会执行,如当栈顶的Activity按back 退到前一Activity时就不会执行。 但从Activity(A1)进入另一Activity(A2)时,会在A1.onPause()前执行A1.onSaveInstance(),并设置Bundle, 如果系统销毁了A1, 从A2返回A1时, A1会重新A1.onCreate(), 并传入之前设置的Bundle
  11. Activity提供默认的onSaveInstanceState()方法来保存UI信息,但其它信息需要你自己保存。View中实现了方法dispatchSaveInstanceState(),onSaveInstanceState()来提供需要保存的UI信息,但View需要设置ID属性且saveEnable的值为true。
  12. Activity启动,回退等情况下各回调方法执行顺序(所有Activity在同一进程),各回调方法都是在主线程执行的,因此严格按照顺序执行, 当需要做相关同步操作时尤其要注意。
  a. 一个Activity(A1)中启动另一个Activity(A2), A2完全覆盖A1
  启动:A1.onSaveInstance() àA1.onPause() àA2.onCreate()àA2.onStart()àA2.onResume()àA1.o
  nStop()
  回退(A1未被销毁):A2.onPauseàA1.onRestart()àA1.onStart()àA1.onResume()àA2.onStop()
  àA2.onDestroy()
  回退(A1被销毁):A2.onPauseàA1.onCreate()àA1.onStart()àA1.onResume()àA2.onStop()
  àA2.onDestroy()
  b. 一个Activity(A1)中启动另一个Activity(A2), A2部分覆盖A1或半透明
  启动:A1.onSaveInstance() àA1.onPause() àA2.onCreate()àA2.onStart()àA2.onResume()
  回退(A1未被销毁):A2.onPauseàA1.onResume()àA2.onStop()àA2.onDestroy()
  启动后A1被销毁,则A1会立即重建A1.onCreate()àA1.onStart()àA1.onResume()àA1.onStop()
  A2启动A3
  启动:A2.onPause()àA1.onStop()àA3.onCreate()àA3.onStart()àA3.onResume()àA2.onStop()
  回退(A1未被销毁):A3.onPauseà A1.onRestart()àA1.onStart()à A2.onRestart()àA2.onStart()àA2.onResume()àA3.onStop()àA3.onDestroy()
  回退(A1被销毁):A3.onPauseà A1.onCreate()àA1.onStart()àA1.onResume()àA1.onPause() A2.onRestart()àA2.onStart()àA2.onResume()àA3.onStop()àA3.onDestroy()
  13. 处理配置变法:一些设备的配置可能会在运行时改变,如屏幕方向,键盘及语言等,当这些改变发生时,系统会销毁并重启这个Activity:onSaveInstanceState()àonPause()àonStop()àonDestroy()àonCreate()àonStart()àonResume(), 重启是为了让你能够适应新的配置并自动重载资源。要适当处理这些变化,使用onSaveInstanceState()和onRestoreInstanceState()方法(或者onCreate())来保存你的状态, 而在onConfigurationChanged()中处理变化。
相关培训:&&&&&&&
相关内容:
我要报名- 请填写你的报名资料
想学课程:
JAVA+3g+物联网软件工程师
C++国际软件工程师
3G-Android工程师
国际软件测试工程师
嵌入式软件工程师
信息渠道:
最感兴趣的学校:
Java物联网软件工程师&3-26&热招中&
C++国际软件工程师&3-26&热招中&
数字艺术UI设计师&3-26&热招中&
PHP/WEB3.0 互联网工程师&3-26&热招中&
国际软件测试工程师&3-26&热招中&
.NET云计算 软件工程师&3-26&热招中&
4G-Android软件工程师&3-26&热招中&
4G-iOS 软件工程师&3-26&热招中&
嵌入式软件工程师&3-26&热招中&
高端Linux网络工程师&3-26&热招中&
网络营销工程师&3-26&热招中&
想学课程:
Java威震天下
C++宝刀屠龙
国际软件测试
Andriod技术新贵
嵌入式中间力量Android04-深入理解Activity与Fragment_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者市场?营销?拓展总监17655.0浏览总量总评分
评价文档:
暂无相关推荐文档
Android04-深入理解Activity与Fragment|提​高​编​写​代​码​和​编​程​调​试​能​力​,​使​其​具​有​扎​实​的​编​程​功​底​,​同​时​还​能​帮​助​所​学​者​掌​握​面​向​对​象​的​思​维​方​式​,​
​
​真​正​拥​有​一​个​面​向​对​象​的​心​。
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
大小:2.41MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读2862人阅读
在Android中,两个Acitivity之间是靠Intent传递信息的,因为Intent本来就起到信使的作用,所以用它来传递数据也显得顺理成章了.Intent 提供了多个方法来&携带&额外的数据putExtras(Bundle data): 向Intent中放入需要&携带&的数据putXxx(String key,Xxx date):向Bundle放入Int,Long等各种类型的数据(Xxx指代各种数据类型的名称)putSerializable(String key,Serializable date):向Bundle中放入一个可序列化的对象.当然Intent也提供了相应的取出&携带&数据的方法getXxx(String key):从Bundle取出Int,Long 等各种数据类型的数据.getSerializable(String Key,Serializable data): 从Bundle取出一个可序列化的对象.下面以使用getSerializable为例,定义一个可序列化的Person类,模拟一个用户注册的过程,通过注册那个窗口(Acitivity)传递注册信息到另一个窗口下面是定义的一个DTO类Person用来记录注册的信息,注意!要定义成可序列化的类,继承Serializablepackage WangLi.Activity.B
import java.io.S
public class Person implements Serializable {
private String _N
private String _P
private String _G
public String getName()
public String getPass()
public String getGender()
public Person(String Name,String Passwd,String Gender)
this._Name = N
this._Passwd = P
this._Gender = G
第一个Activity界面如图填入注册信息后,点&注册&后跳到新窗口,显示刚刚输入的信息下面是注册窗口,界面xml 和代码&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&/apk/res/android&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
android:orientation=&vertical& &
&TableLayout
android:layout_width=&fill_parent&
android:layout_height=&wrap_content& &
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:text=&请输入您的注册信息&
android:textSize=&20sp&
&TableRow&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:text=&用户名:&
android:textSize=&16sp&
android:id=&@+id/name&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:hint=&请填写想注册的账号&
android:selectAllOnFocus=&true&
&/TableRow&
&TableRow&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:text=&密码:&
android:textSize=&16sp&
android:id=&@+id/passwd&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:password = &true&
android:selectAllOnFocus=&true&
&/TableRow&
&TableRow&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:text=&性别&
android:textSize=&16sp&
&RadioGroup
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:orientation=&horizontal&
&RadioButton
android:id=&@+id/male&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:text=&男&
android:textSize=&16sp&
&RadioButton
android:id=&@+id/female&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:text=&女&
android:textSize=&16sp&
&/RadioGroup&
&/TableRow&
&TableRow&
android:id=&@+id/bn&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:text='注册'
android:textSize=&16sp&
&/TableRow&
&/TableLayout&
&/LinearLayout&package WangLi.Activity.B
import android.app.A
import android.content.I
import android.os.B
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.EditT
import android.widget.RadioB
public class BundleTest extends Activity {
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bn = (Button)findViewById(R.id.bn);
bn.setOnClickListener(new OnClickListener()
public void onClick(View v)
EditText name = (EditText)findViewById(R.id.name);
EditText passwd = (EditText)findViewById(R.id.passwd);
RadioButton male = (RadioButton)findViewById(R.id.male);
String gender = male.isChecked() ? &男& : &女&;
Person p = new Person(name.getText().toString(),passwd.getText().toString(),gender);
//创建Bundle对象
Bundle data = new Bundle();
data.putSerializable(&person&, p);
//创建一个Intent
Intent intent = new Intent(BundleTest.this,ResultActivity.class);
intent.putExtras(data);
//启动intent对应的Activity
startActivity(intent);
}下面是第接受信息窗口在接受到注册信息以后的样子第二个接受信息窗口界面xml 及代码&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&/apk/res/android&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
android:orientation=&vertical& &
&TableLayout
android:layout_width=&fill_parent&
android:layout_height=&wrap_content& &
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:text=&请输入您的注册信息&
android:textSize=&20sp&
&TableRow&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:text=&用户名:&
android:textSize=&16sp&
android:id=&@+id/name&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:hint=&请填写想注册的账号&
android:selectAllOnFocus=&true&
&/TableRow&
&TableRow&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:text=&密码:&
android:textSize=&16sp&
android:id=&@+id/passwd&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:password = &true&
android:selectAllOnFocus=&true&
&/TableRow&
&TableRow&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:text=&性别&
android:textSize=&16sp&
&RadioGroup
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:orientation=&horizontal&
&RadioButton
android:id=&@+id/male&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:text=&男&
android:textSize=&16sp&
&RadioButton
android:id=&@+id/female&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:text=&女&
android:textSize=&16sp&
&/RadioGroup&
&/TableRow&
&TableRow&
android:id=&@+id/bn&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:text='注册'
android:textSize=&16sp&
&/TableRow&
&/TableLayout&
&/LinearLayout&package WangLi.Activity.B
import android.app.A
import android.content.I
import android.os.B
import android.widget.TextV
public class ResultActivity extends Activity {
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.result);
TextView name = (TextView)findViewById(R.id.name);
TextView passwd = (TextView)findViewById(R.id.passwd);
TextView gender = (TextView)findViewById(R.id.gender);
//获取启动该Result的Intent
Intent intent = getIntent();
//获取该intent所携带的数据
Bundle data = intent.getExtras();
//从Bundle包中取出数据
Person p = (Person)data.getSerializable(&person&);
name.setText(&用户名:&+p.getName());
passwd.setText(&密码:&+p.getPass());
gender.setText(&性别:&+p.getGender());
}当然,最后也别忘了把所有Activity都加入AndroidManifest.xml中
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2592702次
积分:38608
积分:38608
排名:第41名
原创:1125篇
转载:560篇
评论:926条
(9)(3)(7)(1)(2)(8)(5)(2)(2)(1)(2)(2)(10)(9)(9)(2)(12)(10)(3)(6)(4)(3)(4)(16)(5)(12)(12)(7)(20)(25)(24)(10)(7)(4)(2)(4)(34)(12)(2)(6)(6)(1)(2)(4)(1)(8)(28)(9)(3)(3)(3)(5)(4)(2)(5)(2)(2)(3)(2)(1)(3)(3)(3)(2)(3)(2)(16)(7)(4)(10)(3)(8)(10)(11)(47)(151)(158)(11)(12)(47)(16)(16)(87)(71)(65)(164)(89)(61)(14)(10)(12)(19)(6)(5)(18)(14)(21)(11)(31)(20)(30)(4)(2)(1)(6)Android应用中一种Activity窗口管理系统
查看: 479|
摘要: 本文先介绍了Android 的系统架构及其组件
Activity 的生命周期,然后阐述了设计Activity 窗口管
理系统的原理和关键模块并简要介绍了使用方法和应
用范围;最后展示实验结果,总结了优势;为Android
平台下应用开发中的Activity 管理,提供了一种简单,
灵活,易操作的管理方案。
&计 算 机 系 统 应 用 http://www.c-s- 2012 年 第21 卷 第 6 期
224 经验交流 Experiences Exchange
Android 应用中一种Activity 窗口管理系统①
夏德冰,陈庆奎
(上海理工大学 光电信息与计算机工程学院,上海 200093)
摘 要:Android 应用程序是由多个组件组成的,Activity 作为Android 程序的重要组件之一,用于显示可视化的
用户界面,接收与用户交互所产生的界面事件。本文提出了AWMS(Activity Window Management System)机制,
用于在多Activity 窗口的应用中存储已开启的Activity 窗口,以方便程序调用Activity 句柄,对其数据及状态进
行操作。实现了对Activity 实例的获取以及对任务中每一个Activity 的获取。
关键词:Android 操作系统;Activity 生命周期;Activity 窗口管理;多任务
Activity Window Management System in the Android applications
XIA De-Bing, CHEN Qing-Kui
(School of Optical-Electrical and Computer Engineering, University of Shanghai for Science and Technology, Shanghai 200093, China)
Abstract:Android applications are composed of multiple components, Activity as an important component of Android
applications, used to display a visual user interface and receive user interface events generated by interaction. In the
paper, AWMS(Activity Window Management System) mechanism is used to store the Activity window in multiple
applications, which simplified operation for calling Activity handle to operate its data and state. Thus implement the
simplified operation for getting the Activity instance and each of the Activity in the tasks.
Key words:Andr activi multiple tasks
随着手机功能日趋强大,手机应用软件已成为用
户直接操作和应用的主体,美观实用、操作便捷的用
户界面会为应用软件带来巨大的市场前景。Google 公
司推出的Android 是开源的手机操作系统,为其应用
程序的开发提供了广阔的发展空间[1]。而Android 应用
程序是由多个组件构成的,其中组件Activity 是
Android 应用程序生命周期的重要组成部分,其运行与
管理是整个系统的基础。本文通过对 Activity 生命周
期以及栈和任务的研究,设计了一种Activity 窗口管
理系统,介绍了其原理、组成、算法及优势;为Activity
的动态加载、程序的快速退出以及Activity 的数据获
取及控制等实际开发中的重要问题提供了一种良好的
解决方案。
1 Android相关技术简介
1.1 Activity 生命周期
Android 提供的每个生命周期方法都有不同用途,
这些生命周期方法分别在活动的前台阶段、可见阶段
或整个生命周期阶段被调用。生命周期每个部分中常
用的方法和前后台阶段涉及到的方法如图1 所示[3]。
Activity 的生命周期是从创建到销毁的过程,包括活动
状态,暂停状态,停止状态,非活动状态[2,3],其主要
方法如下:
onCreate():创建Activity 时调用,对所有的“全
局”状态做初始设置。并以Bundle 的形式提供对以前
存储的任何状态进行访问。
onRestart():重新启动Activity 时调用。该Activity
① 基金项目:国家自然科学基金项目();上海信息技术领域重点科技攻关项目();上海重点科技项目();
上海市重点学科建设项目(S30501)
收稿时间:;收到修改稿时间:
2012 年 第21 卷 第 6 期 http://www.c-s- 计 算 机 系 统 应 用
Experiences Exchange 经验交流 225
仍在栈中,而不是启动一个新的Activity。
onStart():Activity 变为在屏幕上对用户可见时调
onResume():Activity 开始与用户交互时调用(启
动和重新启动Activity,该方法都被调用)。
onPause():Activity 被暂停或收回CPU 和其他资
源时调用。该方法是用来保存Activity 状态的地方,
以便Activity 被重新启动时可以具有与其退出时相同
图1 Activity 生命周期以及前后台阶段状态图
onStop():Activity 被停止并被转换为不可见阶段
及后续的生命周期事件时调用。
onDestroy():Activity 被完全从系统内存中移除时
调用。该方法被调用可能是因为有人直接调用onFinish
()方法或者系统决定停止该Activity 以释放资源。
1.2 Activity 和任务
Android 的核心特点是一个应用可以使用其他应
用的组件(需要应用授权),而应用不需要包含用到的
另一个应用的代码也不需要连接这些代码,只是在需
要时启动其包含的组件。一个Activity 可以启动另一
个Activity,包括不同应用中的Activity。并可以通过
BACK 键后退使之前的Activity 重现在屏幕上。
Android 通过将这两个Activity 放进一个任务中来实现
这种用户体验[4]。任务是栈中的一组相关的Activity,
栈中的根节点是任务的初始Activity(通常为用户首先
启动的Activity)。栈顶的Activity 是当前正在运行的
Activity,当一个Activity 启动另一个Activity 时,新
的Activity 被压入栈中,成为运行的Activity。当用户
按BACK 键时,当前Activity 弹出栈,先前的Activity
恢复为运行的Activity 显示在屏幕上。Activity 不会在
栈中重组,而只是“后入先出”地入栈与出栈。Android
支持多任务切换。一个任务里所有Activity 组成一个
单元,整个任务可以在前台或后台运行,应用程序的
切换就是任务的切换。任务不是在AndroidManifest.
xml 文件里的一个类或元素,所以没办法为一个任务
里的Activity 独立设置值。
以上为Activity 和任务的默认行为,Android 提供
其他方法修改这种机制的所有方面。Activity 和任务的
关联以及任务中Activity 的行为都要受到启动Activity
的Intent 对象的Flag 和AndroidManifest.xml 文件中的
Activity 属性集合共同控制。主要的Intent 标记为:
FLAG_ACTIVITY_NEW_TASK,FLAG_ACTIVITY_C
LEAR_TOP,FLAG_ACTIVITY_RESET_TASK_IF_NE
EDED,FLAG_ACTIVITY_SINGLE_TOP 。主要的
Activity 属性为: taskAffinity,launchMode,allowTask
Reparenting,clearTaskOnLaunch,alwaysRetainTaskState,
finishOnTaskLaunch。
同时,Android 提供Activity 四种加载模式[2]:
standard:标准默认模式,通过调用startActivity()方法
产生一个新的实例;singleTop:如果有一个实例位于
Activity 栈顶,则不产生新的实例,而只是调用Activity
中的newInstance()方法。否则,产生一个新的实例。
singleTask:会在一个新的任务中产生实例,以后每次
都会该实例,不会去产生新的实例。singleInstance:
与singleTask 基本相同,只有一个区别:在该模式下
Activity 实例所处的任务中,只能有这一个实例不能有
其他实例。这些启动模式都需要在功能清单Android
Manifest.xml 中进行设置launchMode 属性。
2 AWMS的设计
2.1 AWMS 设计原理
在实际应用中,一个Android 应用程序往往包括多
个Activity,且多个Activity 窗口之间可以相互跳转,虽
然彼此结合形成一个共同的应用接口,但是每个Activity
都是独立的,都是Activity 的子类。要将每个Activity 窗
口进行管理,则必须将这些实例保存起来。AWMS 中选
择ArrayList作为容器,装载打开的Activity 窗
口,其中 ArrayList 是List 接口的一个可变长数组的实
现,可以满足随时添加或移除Activity 的要求。AWMS
将用户开启Activity 窗口的轨迹进行“记忆”,将Activity
从容器底端按照开启的顺序依次存储到容器中。容器的
计 算 机 系 统 应 用 http://www.c-s- 2012 年 第21 卷 第 6 期
226 经验交流 Experiences Exchange
进出遵循“后进先出”的原则,位于容器顶端的Activity
为正在运行状态的Activity 显示在屏幕上;处于容器顶
端以下的Activity,但并没有销毁,而是处于暂停/停止
状态;当按BACK 键返回时,就将容器顶的Activity 移
出并销毁,同时将之前开启的Activity(即此时位于容器
顶的Activity 窗口)转成运行状态,显示在屏幕上,而
不需要重新创建之前的Activity 了;每个被存储的
Activity 都有自己的句柄(再次开启之前的Activity 窗口,
会被重新存储在容器中);当退出应用程序时,从容器顶
到容器底,依次将压入容器的Activity 移出并销毁。
AWMS 设计原理图如图2 所示。
图2 AWMS 设计原理图
2.2 AWMS 的组成和算法
AWMS 主要由8 个部分组成,一个容器采用
ArrayList和7 个重要函数模块:
(1)创建容器:private static ArrayList
actiList_ =
(2)addActivity 模块:该函数在Activity 的
onCreate()方法中调用,实现被创建的Activity 都压入
到容器中。public static void addActivity(Activity
activity) {
Log.e("Tag", "addActivity");
if (activity != null) {
if (actiList_ == null)
actiList_ = new ArrayList(0);
actiList_.add(activity);
(3)removeActivity 模块:从容器中移除当前的
Activity,实现销毁的Activity 从容器中移除。
public static void removeActivity(int actId) {
if (actiList_ == null || actiList_.size() == 0)
if (actId >= actiList_.size())
Activity act = actiList_.remove(actId);
act.finish();
} catch (Exception e) {
(4)getHomeActivity 模块:实现获取最早开启
的处于容器底端的Activity。
public static Activity getHomeActivity() {
if (actiList_ == null || actiList_.size() == 0)
return actiList_.get(0);
(5)getTopActivity 模块:实现获取容器顶端的
Activity。
public static Activity getTopActivity() {
if (actiList_ == null || actiList_.size() == 0)
return actiList_.get(actiList_.size() - 1);
( 6 ) getLastActivity 模块: 实现获取上一个
Activity。
public static Activity getLastActivity() {
Log.e("Tag", "getLastActivity");
if (actiList_ == null || actiList_.size()
Activity act = actiList_.get(i - 1);
if (act == null) {
actiList_.remove(i - 1);
2012 年 第21 卷 第 6 期 http://www.c-s- 计 算 机 系 统 应 用
Experiences Exchange 经验交流 227
actiList_.remove(i - 1);
act.finish();
} catch (Exception e) {
Log.e("clearActivity fail+e.toString(),"");
(8)getActivitys 模块:返回ArrayList
容器,通过调用该函数实现获取压入容器的所有
Activity 实例。
public static ArrayList getActivitys() {
return actiList_;
3 实验结果与优点分析
图3 为实验的运行过程的界面显示图,图4 为程
序运行通过Logcat 打印出的4 个Activity 的生命周期
情况以及运行中的数据信息。其中:
步骤1:Activity01 中显示了一段从网络获取的数
据信息。点击“按钮2”跳转到Activity02,Activity02
运行,刷新Activity01 中的数据,并且获取显示在
Activity02 的屏幕上(经历:01 暂停->02 显示在界面
->01 停止)。
步骤2:Activity02 正在运行的状态下,切换任务,
开启拨打电话的应用(经历:02 暂停->02 停止)。
步骤3:在电话应用界面上,按BACK 返回,屏
幕显示Activity02,恢复离开前的状态(经历:02 从
可见阶段的onRestart()->onStart() 到前台阶段的
onResume(),02 运行。图4 蓝色框部分为步骤2、3)。
步骤4:Activity02 点击“按钮3”跳转到Activity03
窗口(经历:02 暂停->03 运行->02 停止)。
步骤5:Activity03 点击“按钮4”跳转到Activity04
窗口(经历:03 暂停->04 运行->03 停止)。
步骤6:Activity04 按BACK 键返回Activity03 窗
口(经历:04 暂停->03 从可见阶段的onRestart()->
onStart()到前台阶段的onResume(),03 显示在屏幕上
->04 停止->04 销毁)。
步骤7:Activity03 点击“按钮4”跳转到Activity04
窗口(经历:03 暂停->04 重新创建运行->03 停止)。
步骤8:Activity04 点击“退出应用”按钮,退出
整个应用程序,显示手机HOME 界面(经历:04 暂
停->03 销毁->02 销毁->01 销毁->04 停止->04 销毁)。
图3 运行界面
图4 Activity 的生命状态及数据结果
优势分析:
AWMS 在开发中的可以随开发者需求的不同而有
不同的应用方式。比如:添加自己需要的模块,在需
要验证用户的时候可以添加登录界面等;在Activity
比较少的应用中,AWMS 可以只作为一个类来提供其
他Activity 进行调用等等。AWMS 的使用范围不止如
此,在游戏应用等多Activity 的程序中用户界面可能
有几十个或者更多,或者浏览器这样的未知窗口数量,
需要动态加载Activity 的应用,AndroidManifest.xml
文件不需要或者不可能对如此多的Activity 添加定义
。此时,窗口的整体框架基本相同,可以
通过一个Activity 来实现AWMS 并提供方法作为基
类,方便各个Activity 窗口进行继承来调用其方法,
从而实现管理整个应用的所有Activity 窗口。实际开
发中,AWMS 的灵活性和可扩展性可以使开发者根据
具体应用的不同,对其进行扩展,产生更多的功能。
总之,AWMS 的优势为:(1)有序存储已开启的
Activity 窗口,便于当前Activity 调用其他Activity 句
柄,实现了当前Activity 窗口对已开启的其他窗口的
灵活操作;(2)退出程序,可以一步销毁所有Activity
窗口直接退出,无需将已开启的Activity 窗口一一返
(下转第248 页)
计 算 机 系 统 应 用 http://www.c-s- 2012 年 第21 卷 第 6 期
248 产品应用Special Issue
图8 Zigbee 模块原理图
图9 Zigbee 模块程序流程图
(上接第227 页)
回显示,再退出;(3)支持多任务情况下切换任务,
可以按BACK 键直接回到之前应用窗口,恢复当时的
状态,无需重新开启应用程序。
本文先介绍了Android 的系统架构及其组件
Activity 的生命周期,然后阐述了设计Activity 窗口管
理系统的原理和关键模块并简要介绍了使用方法和应
用范围;最后展示实验结果,总结了优势;为Android
平台下应用开发中的Activity 管理,提供了一种简单,
灵活,易操作的管理方案。
Zigbee 模块首先使用串口接收红外指令,然后通
过射频通信,将红外指令发送到各个分控节点。
随着Intemet 技术的发展以及32 位微处理器时代
的来临,信息家电、信息家庭的概念已开始深入人心。
提出以ARM9 的32 位微处理器S3C2440A 作为家庭
网关的中央处理器,软件上以嵌入式Linux 为平台,
实现了短信接收、遥控器自学习、红外指令发送等功
能。该家庭网关成本较低,易于升级,便于推广应用。
1 黄布毅,张晓华.基于AMR-Linux 的SQLite 嵌入式数据库
技术.单片机与嵌入式系统应用,&#61485;24.
2 王京谦,万花新.开源嵌入式数据库Berkelye DB 和SQLite
的比较.单片机与嵌入式系统应用,&#61485;7.
3 杨利平,龚卫国,李伟红,王华华,周留洋.基于网络技术的远
程智能家居系统.仪器仪表学报,):308&#.
4 张靖强,杜彦亭,杨进.基于家用计算机的远程家电控制的设
计与实现.计算机应用,4&#.
5 冯东,陈俊杰.基于Linux 的智能家居网关管理软件设计与
实现.舰船电子工程,6&#.
6 夏玉杰,张栓记.基于ARM 的嵌入式家庭网关研究与设计.
ARM 开发与应用,4&#.
7 郭文慧.智能家电控制器的虚拟实现.安徽理工大学,2009,06.
1 Butler M. Android: Changing the Mobile Landscape. Pervasive
Computing, IEEE, 485;7.
2 Android Developer..
3 W.Frank Ableson, Charlie Collins, Robi Sen. Google Android
揭秘.北京:人民邮电出版社,485;60.
4 隆益民.Android 应用开发.广州:中山大学出版社, 485;
Copyright &

我要回帖

更多关于 android activity跳转 的文章

 

随机推荐