新浪微博项目主框架搭建_第1页
新浪微博项目主框架搭建_第2页
新浪微博项目主框架搭建_第3页
新浪微博项目主框架搭建_第4页
新浪微博项目主框架搭建_第5页
已阅读5页,还剩21页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Create

projectWeiboCom.itcast.»

Ui»

Db»

Util»

Logic»

weiboUI流程进程与生命周期Android系统会尽可能长的延续一个应用程序进程,但在内存过低的时候,仍然会不可避免需要移除旧的进程。为决定保留或移除一个进程,Android将每个进程都放入一个“重要性层次”中,依据则是它其中运行着的组件及其状态。重要性最低的进程首先被消灭,然后是较低的,依此类推。重要性共分五层,依据重要性列表如下:1.

前台进程是用户操作所必须的。当满足如下任一条件时,进程被认为是处于前台的:任一时间下,仅有少数进程会处于前台,仅当内存实在无法供给它们维持同时运行时才会被杀死。一般来说,在这种情况下,设备已然处于使用虚拟内存的状态,必须要杀死一些前台进程以用户界面保持响应。2.

可视进程没有前台组件,但仍可被用户在屏幕上所见。当满足如下任一条件时,进程被认为是可视的:、o

它包含着一个不在前台,但仍然为用户可见的activity(它的onPause()方法被调用)。这种情况可能出现在以下情况:比如说,前台activity是一个对话框,而之前的activity位于其下并可以看到。o

它包含了一个绑定至一个可视的activity的服务。可视进程依然被视为是很重要的,非到不杀死它们便无法维持前台进程运行时,才会被杀死。3.

服务进程是由startService()方法启动的服务,它不会变成上述两类。尽管服务进程不会直接为用户所见,但它们一般都在做着用户所关心的事情(比如在后台播放mp3或者从网上下载东西)。所以系统会尽量维持它们的运行,除非系统内存不足以维持前台进程和可视进程的运行需要。4.

背景进程包含目前不为用户所见的activity(Activity对象的onStop()

方法已被调用)。这些进程与用户体验没有直接的联系,可以在任意时间被杀死以回收内存供前台进程、可视进程以及服务进程使用。一般来说,会有很多背景进程运行,所以它们一般存放于一个

LRU(最后使用)列表中以确保最后被用户使用的activity最后被杀死。如果一个activity正确的实现了生命周期方法,并捕获了正确的状态,则杀死它的进程对用户体验不会有任何不良影响。5.

空进程不包含任何活动应用程序组件。这种进程存在的唯一原因是做为缓存以改善组件再次于其中运行时的启动时间。系统经常会杀死这种进程以保持进程缓存和系统内核缓存之间的平衡。Android会依据进程中当前活跃组件的重要程度来尽可能高的估量一个进程的级别。比如说,如果一个进程中同时有一个服务和一个可视的activity,则进程会被判定为可视进程,而不是服务进程。此外,一个进程的级别可能会由于其它进程依赖于它而升高。一个为其它进程提供服务的进程级别永远高于使用它服务的进程。比如说,如果A进程中的内容提供者为进程B中的客户端提供服务,或进程A中的服务为进程B中的组件所绑定,则A进程最低也会被视为与进程B拥有同样的重要性。因为运行着一个服务的进程重要级别总高于一个背景activity。所以一个activity以启动一个服务的方式启动一个长时间运行过程比简单的衍生一个线程来进行处理要好。尤其是当处理过程比activity本身存在时间要长的情况之下。我们以背景音乐播放和上传一个相机拍摄的图片至网站上为例。使用服务则不论activity发生何事,都至少可以保证操作拥有“服务进程”的权限。如上一节广播接收器生命周期所提到的,这也正是广播接收器使用服务,而不是使用线程来处理耗时任务的原因。核心服务组件1public

class

MainService

extends

Service

implements

Runnable{public

static

Weibo

weibo=new

Weibo();public

static

User

nowuser;publicstatic

ArrayList<Activity>allActivity=newArrayList<Activity>();//保存所有Activitypublic

static

int

lastActivityId;//保存前端Activity编号//保存用户头像public

static

HashMap<Integer,BitmapDrawable>

alluserIcon=newHashMap<Integer,BitmapDrawable>();//从集合中通过name获取Activity对象public

static

Activity

getActivityByName(String

name)public

static

ArrayList<Task>

allTask=new

ArrayList<Task>();public

static

void

newTask(Task

task)public

booleanisrun=true;核心服务组件2••••••public

void

onCreate()

{//

TODO

Auto-generated

method

stubsuper.onCreate();Thread

t=new

Thread(this);t.start();//启动服务子线程完成所有费时操作}••••••@Overridepublic

void

onDestroy()

{//

TODO

Auto-generated

method

stubsuper.onDestroy();isrun=false;}核心服务组件3public

void

run()

{System.setProperty("weibo4j.oauth.consumerKey",

Weibo.CONSUMER_KEY);System.setProperty("weibo4j.oauth.consumerSecret",

Weibo.CONSUMER_SECRET);try{while(isrun){

Task

lastTask;synchronized(allTask){//接任务if(allTask.size()>0){lastTask=allTask.get(0);//执行任务doTask(lastTask);}}try{Thread.sleep(1000);}catch(Exception

e){}}}catch(Exception

e){isrun=false;}}核心服务组件4////执行任务发消息更新Uipublic

void

doTask(Task

task)

throws

WeiboException{Message

mess=hand.obtainMessage();//产生Ui更新消息对象mess.what=task.getTaskID();switch(task.getTaskID()){case

Task.TASK_GET_USER_INFO://获取用户信息nowuser=weibo.showUser(((Integer)task.getTaskParam().get("uid")).toString());break;case

Task.TASK_NEW_WEIBO://发布新微博String

weibotxt=(String)task.getTaskParam().get("weibotext");weibo.updateStatus(weibotxt);Case

…}hand.sendMessage(mess);//发送UI刷新的消息allTask.remove(0);//移除除任务}核心服务组件5//定义Handle对象负责完成Ui的更新public

Handlerhand=newHandler(){//接收消息刷新数据到UIpublic

void

handleMessage(Message

msg)

{super.handleMessage(msg);switch(msg.what){case

Task.TASK_GET_USER_HOMETIMEINLINE://更新首页Activity

activity=MainService.getActivityByName("HomeActivity");IWeiboActivity

ia=(HomeActivity)activity;//更新微博请求Integer

type=((HomeActivity)activity).UI_REFRESH_STATUS;List<Status>

alls=(List<Status>)msg.obj;ia.refresh(type,alls);break;case

Task.TASK_GET_USER_INFO://获取用户资料case

Task.TASK_GET_USER_IMAGE_ICON://获取用户头像case

Task.TASK_GET_USER_HOMETIMEINLINE_MORE://获取到了更多微博主页信息case

Task.TASK_NEW_WEIBO://发表新微博成功}};Activity核心逻辑package

itcast.logic;public

interface

IWeiboActivity

{void

init();void

refresh(Object

...param);}public

static

final

int

TASK_GET_USER_INFO=0;//获取用户详细信息public

static

final

int

TASK_GET_USER_HOMETIMEINLINE=1;//获取用户首页博客public

static

final

int

TASK_GET_USER_IMAGE_ICON=2;//获取用户头象图片public

static

final

int

TASK_GET_USER_FRIEND=3;//获取用户所有好友public

static

final

int

TASK_GET_USER_HOMETIMEINLINE_MORE=4;//获取用户首页博客下一页public

static

final

int

TASK_NEW_WEIBO=5;//发表新微博public

Task(int

id,Map

param){

this.taskID=id;this.taskParam=param;}public

int

getTaskID()

{

return

taskID;public

void

setTaskID(int

taskID)

{this.taskID

=

taskID;package

itcast.logic;import

java.util.Map;public

classTask

{private

int

taskID;//任务编号private

Map

taskParam;//任务参数•••••••••••}••}public

Map

getTaskParam()

{return

taskParam;}public

void

setTaskParam(Map

taskParam)

{this.taskParam

=taskParam;}}通过Task改变UILogoActivity实现Logo功能描述:全屏幕由浅入深显示3秒钟欢迎界面跳转流程:跳转到用户登录窗口之后自动销毁图片资源•logo_bg.png•<?xml

version="1.0"

encoding="utf-8"?><LinearLayout

xmlns:android="

"android:background="@color/white"android:orientation="vertical"android:gravity="center"android:layout_width="fill_parent"android:layout_height="fill_parent"><ImageViewandroid:id="@+id/logo_bg"android:src="@drawable/logo_bg"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout><application

android:icon="@drawable/icon"

android:label="@string/app_name"android:theme="@style/notitle">/*

设置为无标题栏*/requestWindowFeature(Window.FEATURE_NO_TITLE);/*

设置为全屏模式*/getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);Values/style.xml<style

name="notitle"><item

name="android:windowNoTitle">true</item></style>登录窗口实现用户登录功能描述:实现用户登录的交互,如果网络错误,提示网络设置窗口,如果登录失败提示登录失败。跳转流程:如果登录成功,跳转到主UI.图片资源:search_bg.pngtitle_button_normal

.pngtitle_button_selected.pngdivider_horizontal_timeline.pngregist_weibo_n.pngregist_weibo_s.pngLogin.xml<?xml

version="1.0"

encoding="utf-8"?><LinearLayout

xmlns:android="

"android:background="@color/white“android:orientation="vertical"android:layout_width="fill_parent"

android:layout_height="fill_parent"><include

android:id="@+id/title"

layout="@layout/title_two_button"/><TextView

android:paddingLeft="10dip“

android:textSize="16dip"android:textColor="@color/black"android:layout_width="fill_parent"

android:layout_height="wrap_content" android:text="账号"/><AutoCompleteTextView

android:id="@+id/user"android:layout_marginLeft="10dip"

android:layout_width="fill_parent"android:layout_height="wrap_content"

pletionThreshold="1"

android:singleLine="true"

android:inputType="textEmailAddress"/><TextView

android:paddingLeft="10dip"

android:textSize="16dip"

android:textColor="@color/black"android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="密码"

/><EditText

android:id="@+id/password"

android:layout_marginLeft="10dip"

android:layout_width="fill_parent"android:password="true"

android:singleLine="true"

/>android:layout_height="wrap_content"<Buttonandroid:id="@+id/loginButton"android:layout_gravity="center_horizontal"android:background="@drawable/regist_weibo"android:layout_width="180dip"android:layout_height="50dip"android:textColor="@color/white"

android:text="登陆"android:divider="@drawable/divider_horizontal_timeline"android:dividerHeight="2.0dip"/></LinearLayout>Res/layout/title_two_button.xml<FrameLayoutandroid:id="@+id/FrameLayout01"

android:layout_width="fill_parent"

android:layout_height="wrap_content"xmlns:android="

"><TextView

android:id="@+id/textView"

android:layout_height="45dip"android:textColor="@color/black"android:textSize="25dip"android:layout_width="fill_parent"android:background="@drawable/search_bg"android:gravity="center"></TextView><Button

android:id="@+id/title_bt_left"

android:textColor="@color/white"android:layout_gravity="center_vertical"android:background="@drawable/title_button"android:layout_height="36dip"

android:layout_width="49dip"></Button><Button

android:id="@+id/title_bt_right"android:background="@drawable/title_button"android:layout_gravity="right"android:layout_height="36dip"android:textColor="@color/white"android:layout_width="49dip"

android:layout_marginRight="2dip"android:layout_marginTop="4dip"></Button></FrameLayout>Res/drawable/title_button.xml<?xml

version="1.0"

encoding="UTF-8"?><selectorxmlns:android="

"><item

android:state_focused="true"android:drawable="@drawable/title_button_selected"

/><item

android:state_selected="true"android:drawable="@drawable/title_button_selected"

/><item

android:state_pressed="true"android:drawable="@drawable/title_button_selected"

/><item

android:state_enabled="false"android:drawable="@drawable/title_button_selected"

/><item

android:drawable="@drawable/title_button_normal"

/></selector>drawable/regist_weibo.xml<?xml

version="1.0"

encoding="UTF-8"?><selectorxmlns:android="

"><item

android:state_focused="true"

android:state_enabled="true"android:state_pressed="false"android:drawable="@drawable/regist_weibo_n"

/><item

android:state_enabled="true"

android:state_pressed="true"android:drawable="@drawable/regist_weibo_s"

/><item

android:state_enabled="true"

android:state_selected="true"android:drawable="@drawable/regist_weibo_s"

/><item

android:state_enabled="true"

android:state_selected="false"android:drawable="@drawable/regist_weibo_n"

/><item

android:drawable="@drawable/regist_weibo_n"

/></selector>android:divider规定List项目之间用某个图形或颜色来分隔。可以用"@[+][package:]type:name"或者"?[package:][type:]name"(主题属性)的形式来指向某个已有资源;也可以用"#rgb","#argb","#rrggbb"或者"#aarrggbb"的格式来表示某个颜色。可参看全局属性资源符号divider。android:dividerHeight分隔符的高度。若没有指明高度,则用此分隔符固有的高度。必须为带单位的浮点数,如"14.5sp"。可用的单位如px(pixel像素),dp(density-independentpixels与密集度无关的像素),sp(scaled

pixels

based

on

preferredfont

size基于字体大小的固定比例的像素),

in(inches英寸),mm(millimeters毫米)。可以用"@[package:]type:name"或者"?[package:][type:]name"(主题属性)的格式来指向某个包含此类型值的资源。可参看全局属性资源符号

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论