当前位置:  编程技术>移动开发
本页文章导读:
    ▪Activity的生命周期了解        Activity的生命周期理解 Activity 是我们开发Android应用程序最重要的一个类。   这篇文章会涉及到以下几个内容  一 Activity的生命周期  二 让Activity变成一个窗口:Activity属性设定  三 你.........
    ▪ 辛劳的作品,无线城,手机浏览器        辛苦的作品,无线城,手机浏览器 又一超炫手机浏览器  无线城 www.wxecity.com。自己搞了半年,挺辛苦的,不容易啊。简单介绍下吧:“无线(e)城”是一种以参与、体验以及分享的全新的移.........
    ▪ wap开发session治理       wap开发session管理。 手机端的cookie,session和URL重写本文的目的是搞清楚Session, Cookie, Url重写这些概念, 然后在这个基础上阐述如何利用Url重写在Wap门户的开发中维护Session.什么是Session, 什么.........

[1]Activity的生命周期了解
    来源: 互联网  发布时间: 2014-02-18
Activity的生命周期理解

Activity 是我们开发Android应用程序最重要的一个类。

  这篇文章会涉及到以下几个内容

 一 Activity的生命周期
 二 让Activity变成一个窗口:Activity属性设定
 三 你后台的Activity被系统回收怎么办:onSaveInstanceState
 四 调用与被调用:我们的通信使者 - Intent

  一 Activity的生命周期

  和其他手机平台的应用程序一样,Android的应用程序的生命周期是被统一掌控 的,也就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不能改变它,只能学习并适应它。
  
  简单地说一下为什么是这样:我们手机在运行一个应用程序的时候,有可能打进来电话发进来短信,或者没有电了,这时候程序都会被中断,优先去服务电话的基本功能,另外系统也不允许你占用太多资源,至少要保证电话功能吧,所以资源不足的时候也就有可  能被干掉。

  言归正传,Activity的基本生命周期如下代码所示:

public class MyActivity extends Activity {
protected void onCreate(Bundle savedInstanceState);

protected void onStart();

protected void onResume();

protected void onPause();

protected void onStop();

protected void onDestroy();
}

  你自己写的Activity会按需要 重载这些方法,onCreate是免不了的,在一个Activity正常启动的过程中,他们被调用的顺序是 onCreate -> onStart -> onResume, 在Activity被干掉的时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期,但是有人问了 ,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的一个Activity是全屏的那么:onPause->onStop ,恢复的时候onStart->onResume ,如果打断  这个应用程序的是一个Theme为Translucent 或者Dialog 的Activity那么只是onPause ,恢复 的时候onResume 。

  详细介绍一下这几个方法中系统在做什么以及我们应该做什么:

onCreate: 在这里创建界面,做一些数据的初始化工作

onStart:   到这一步变成用户可见不可交互 的

onResume:   变成和用户可交互 的,(在activity栈系统通过栈的方式管理这些个      
                      Activity的最上面,运行完弹出栈,则回到上一个Activity)

onPause:     到这一步是可见但不可交互 的,系统会停止动画等消耗CPU 的事情
                    从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候
                    你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在

                    onResume里读出来,注意:这个方法里做的事情时间要短,因为下一
                    个activity不会等到这个方法完成才启动

onstop:      变得不可见 ,被下一个activity覆盖了

onDestroy:  这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方
                     法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判
                     断它,如果你有一个Progress Dialog在线程中转动,请在onDestroy里
                     把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛
                     异 常 的。                    
             
  onPause,onstop, onDestroy,三种状态下 activity都有可能被系统干掉
   为了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般都是数据库)。实际工作中因为生命 周期的变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀掉还是数据回滚,是吧?因为 Activity可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般我都是采用Android的消息机制[Handler, Message]来处理多线程和界面交互的问题。这个我后面会讲一些,最近因为这些东西头已经很大了,等我理清思绪再跟大家分享。

  二 让Activity变成一个窗口:Activity属性设定 
   
  讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东西,那么很
简单你只需要设置一下Activity的主题就可以了在AndroidManifest.xml 中定义Activity的
地方一句话:

android:theme="@android:style/Theme.Dialog"  
 这就使你的应用程序变成对话框的形式弹出来了,或者

android:theme="@android:style/Theme.Translucent"  
就变成半透明的,[友情提示 -.-]类似的这种activity的属性可以在android.R.styleable 类的AndroidManifestActivity 方法中看到,AndroidManifest.xml中所有元素的属性的介绍都可以参考这个类android.R.styleable

  上面说的是属性名称,具体有什么值是在android.R.style中 可以看到,比如这个"@android:style/Theme.Dialog" 就对应于android.R.style.Theme_Dialog ,('_'换成'.' <--注意:这个是文章内容不是笑脸)就可以用在描述文件中了,找找类定义和描述文件中的对应关系就都明白了。

 三 你后台的Activity被系统回收怎么办:onSaveInstanceState

  当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B
这个时候A会执行

public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);
}
 
B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回
收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数
savedInstanceState,没被收回的就还是onResume就好了。

savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。

if(savedInstanceState != null){
long id = savedInstanceState.getLong("id");
}
 
   就像官方的Notepad教程里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把 那个note取出来,程序就完整一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦, 没准你需要记住滚动条的位置...

  四 调用与被调用:我们的通信使者Intent

  要说Intent了,Intent就是这个这个意图 ,应用程序间Intent进行交流,打个电话啦,来个
电话啦都会发Intent, 这个是Android架构的松耦合的精髓部分,大大提高了组件的复用性,比如你要在你的应用程序中点击按钮,给某人打电话,很简单啊,看下代码先:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + number));
startActivity(intent);

  扔出这样一个意图,系统看到了你的意图就唤醒了电话拨号程序,打出来电话。什么读联系人,发短信啊,邮件啊,统统只需要扔出intent就好了,这个部分设计地确实很好啊。

  那Intent通过什么来告诉系统需要谁来接受他呢?
通常使用Intent有两种方法,第一种是直接说明需要哪一个类来接收代码如下:

Intent intent = new Intent(this, MyActivity.class);
intent.getExtras().putString("id", "1");
tartActivity(intent);

  第一种方式很明显,直接指定了MyActivity为接受者,并且传了一些数据给MyActivity,在MyActivity里可以用getIntent()来的到这个intent和数据。

  第二种就需要先看一下AndroidMenifest中的intentfilter的配置了

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:value="android.intent.action.EDIT" />
<action android:value="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
</intent-filter>   这里面配置用到了action, data, category这些东西,那么聪明的你一定想到intent里也会有这些东西,然后一匹配不就找到接收者了吗?

  action其实就是一个意图的字符串名称。
上面这段intent-filter的配置文件说明了这个Activity可以接受不同的 Action,当然相应的程序逻辑也不一样咯,提一下那个 mimeType,他是在ContentProvider里定义的,你要是自己实现一个ContentProvider就知道了,必须指定 mimeType才能让数据被别人使用。

  不知道原理说明白没,总结一句,就是你调用别的界面不是直接new那个界面,而是通过扔出一个intent,让系统帮你去调用那个界面,这样就多么松藕合啊,而且符合了生命周期被系统管理的原则。

  想知道category都有啥,Android为你预先定制好的action都有啥等等,请亲自访问官方链接Intent

ps:想知道怎么调用系统应用程序的同学,可以仔细看一下你的logcat,每次运行一个程序的时候是不是有一些信息比如:
Starting activity: Intent { action=android.intent.action.MAIN categories={android.intent.category.LAUNCHER} flags=0x10200000 comp={com.android.camera/com.android.camera.GalleryPicker} }
再对照一下Intent的一些set方法,就知道怎么调用


    
[2] 辛劳的作品,无线城,手机浏览器
    来源: 互联网  发布时间: 2014-02-18
辛苦的作品,无线城,手机浏览器
又一超炫手机浏览器  无线城 www.wxecity.com。

自己搞了半年,挺辛苦的,不容易啊。

简单介绍下吧:

“无线(e)城”是一种以参与、体验以及分享的全新的移动生活模式。它是一个生活娱乐的手机软件, 在这里您可以获得日常所需的衣、食、住、行、玩、乐等方方面面的信息。 我们的目标就是主张以手机为载体,将互联网延伸至人们现实生活中, 给我们的手机用户带来诸多便捷服务,提供客观、准确的本土化消费信息指南,以此来不断地提升人们的生活品质。

1 楼 mazengfei 2010-07-12  
桃姐~呵呵 做这个不容易 支持支持~!

    
[3] wap开发session治理
    来源: 互联网  发布时间: 2014-02-18
wap开发session管理。
手机端的cookie,session和URL重写
本文的目的是搞清楚Session, Cookie, Url重写这些概念, 然后在这个基础上阐述如何利用

Url重写在Wap门户的开发中维护Session.



什么是Session, 什么是Cookie?

Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。

Cookie是客户端的存储空间,由浏览器来维持。



什么是Url重写?

服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。

可以试一下,即使不写Cookie,在使用request.getCookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。

实质上 URL 重写是通过向 URL 连接添加参数,并把 session ID 作为值包含在连接中。然而,为使这生效,你需要为你的 servlet 响应部分的每个连接添加 session ID.





知道了Session, Cookie, Url的概念,那么下面的这个问题就不难回答了:



Wap中如何进行Session管理?

Wap与PC不同之处在与Wap1.x不支持Session与Cookie,Wap2.0虽然支持但是只有协议支持还是不行,还要看手机终端支不支持?所以我们的解决方法就是完全不依赖Wap协议,完全不依赖手机终端,使用Url重写进行Session的维护,这个方法只与服务器端有关.



利用Url进行Session重写如何实现?

JSP实现

把 session ID 加到一个连接可以使用一对方法来简化:response.encodeURL() 使 URL

包含 session ID,如果你需要使用重定向,可以使用 response.encodeRedirectURL ()

来对 URL 进行编码。

encodeURL () 及 encodeRedirectedURL () 方法首先判断 cookies 是否被浏览器支持;

如果支持,则参数 URL 被原样返回,session ID 将通过 cookies 来维持。

代码示例:

不使用Url重写:

<a href=http://wwww.myserver.com/servelet/user;userName=awaysrain>Link</a>

使用Url重写:

通过HttpServletResponse接口中的encodeURL()方法编码.

String myURL = response.encodeURL(http://wwww.myserver.com/servelet/user);

<a href= <%=myURL%> _fcksavedurl=" <%=myURL%>" _fcksavedurl=" <%=myURL%>" _fcksavedurl=" <%=myURL%>" >


JSTL实现

<c:url>可以为会话管理重写 URL

<a href="/blog_article/<c_url value=/index.html'/content/sitemap.jsp'/>">View sitemap</a>



Struts实现:

struts配置文件中:

设置属性redirect, contextRelative

<forward name="listArticlesForBlog"

path="/template/listArticlesForBlog.jsp"

redirect="true"

contextRelative="true"/>


最后一个比较搞的问题:

那么在浏览器允许cookie的情况下,不要求浏览器关闭cookie的情况下使用

url重写如何实现?

http://tomcat.apache.org/tomcat-5.5-doc/config/context.html

Context支持cookies参数。 设置cookies="false",强制只从url解析sessionid。

cookies

Set to true if you want cookies to be used for session identifierContext

communication if supported by the client (this is the default). Set to

false if you want to disable the use of cookies for session identifier

communication, and rely only on URL rewriting by the application.

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
HTML教程 iis7站长之家
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3