`
2277259257
  • 浏览: 498426 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

android----四大组件

 
阅读更多

Android四大组件:Activity、Service、Broadcast Receiver、Content Provider

 

Activity

是Android程序与用户交互的窗口,从视觉效果来看,一个Activity占据当前的窗口, 响应所有窗口事件,具备有控件,菜单等界面元素。从内部逻辑来看,Activity需要为了保持各个界面状态,需要做很多持久化的事情,还需要妥善管理生 命周期,和一些转跳逻辑。

onCreate()函数:
       先调用超类的onCreate();然后通过setContentView()为活动Activity加载布局文件;
       通过布局文件中的GridView组件id获取该组件;再调用setListAdapter(ListAdapter)函数填充它(填充数据)

 

 

Service

就是剥离了界面的Activity,它们在很多Android的概念方面比较接近,都是封装一个 完整的功能逻辑,通常都是后台长时间运行,接受上层指令,完成相关事务的模块。定义好需要接受的Intent,提供同步或异步的接口,在上层绑定了它后, 通过这些接口(很多时候都是RPC的...)进行通信。

 

 

 Broadcast Receiver

接收一种或者多种Intent跳转做触发事件,接受相关消息,做一些简单的处理,转换成一条Notification,统一了Android的事件广播模式。

 

 

 Content Provider

提供第三方应用数据的访问方案。可以派生ContentProvider类,对外提供数据,像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的接口模型,大大简化了上层应用,对数据的整合提供了更方便的途径。

 

 Handler待解:扮演联系Activity和Thread的桥梁

搞清楚启动顺序、Activity加载顺序

 

Android程序提供了Invalidate方法实现界面刷新,但是invalidate不能直接在线程中调用(因为违背单线程模型)必须在UI线程中调用且Android UI操作也不是线程安全的,所以Android程序中可以使用的界面刷新方法有两种:Handler和利用postInvalidate()来实现在线程中刷新界面

 

Handler刷新界面:
//在onCreate()中开启线程(在线程run方法中执行业务逻辑,执行完毕调用

Handler.sendMessage()发送Message实例)
new Thread(new GameThread()).start();

//实例化一个handler(接收消息Message实例,处理,调用该界面文件View对象的方法

invalidate()刷新界面)
Handler  myHandler = new Handler(
     public void handleMessage(Message msg){
	switch(msg.what){
                          case  Activity01.REFRESH : 
                                   mGameView.invalidate();
                                   break;
                 }
                 super.handleMessage(msg);
     }
);


class  GameThread implements Runnable{
       public  void  run(){
	while(!Thread.currentThread().isInterrupted()){
	        Message  message = new Message();
	        message.what = Activity01.RERESH;
	        //发送消息
	        Activity01.this.myHandler.sendMessage(message);
	        
	        try{ 
		Thread.sleep(100); 
	        }catch (InterruptedException e){ 
		Thread.currentThread().interrupt(); 
	        }
	}
       }
}

 

postInvalidate()刷新界面:
使用postInvalidate()则比较简单,不需要handler,直接在线程中调用postInvalidate即可

class  GameThread  implements  Runnable{
        public  void  run(){
	while(!Thread.currentThread().isInterrupted()){
	        try{
		Thread.sleep(100);
	        }catch(InterruptedException  e){
		Thread.currentThread().interrupt();
	        }
	        //使用postInvalidate可以直接在线程中更新界面
	        mGameView.postInvalidate();
	  }
        }
}

 

一个程序默认情况下只有一个Process,但是一个Process下可以有多个Thread。在这么多Thread中,有一个Thread我们称之为UI Thread。它在程序运行的时候就被创建,是一个Porcess当中的主线程Main Thread,主要负责控制UI界面的显示、更新、控制交互。在Android程序创建之初,一个Process呈现的是单线程模型,所有的任务都在一个线程中运行。因此,我们认为UI Thread所执行的每一个函数所花费的数据都应该是越短越好,而其他费时工作(访问网络、下载、查询数据库)都应该交给子程序去执行,以免阻塞主程序。
那么UI Thread如何和其他Thread一起工作呢?常用方法是:
创建一个主线程的Handler对象,当做Listener去让子线程能将讯息Push到主线程的Message Quene里,以便触发主线程的handlerMessage()函数,让主线程知道子线程的状态,并在主线程更新UI

 

 

Activity组件:

1、每一个屏幕都将作为一个Activity(每个activity作为一个独立的类来实现,均继承Activity基类)

 

2、切换屏幕是通过打开一个新的activity来实现

一些实例中,一个activity会将返回值返回给前一个activity(如调用startActivityForResult方法)

 

3、当一个新屏幕打开,前一个屏幕将暂停并保存在历史堆栈中,用户可以在历史堆栈中回退、删除屏幕

 

Intent组件:

1、通过Intent来切换屏幕(即跳转Activity)

2、通过Intent来传递数据

     1)数据可直接放在Intent中传递

     2)先放到map型Bundle对象然后再放到Intent对象中传递

     3)数据还可放在包共享SharedPreferences对象中供包内的Activity共享

 

Service:

和Activity差不多,没有用户界面,但是不能自己运行需要通过一个Activity或者其他Context对

象调用,Context.startService()和Context.bindService()

 

 

 

Content Provider:

共享数据(文件、SQLite数据库、网络、等)

 

 

 

一、根据用途构建不同类型的Intent组件:

Intent intent = new Intent(Intent.ACTION_SEARCH);

 

Intent intent = new Intent(Main.this,DialogActivity.class);

 

Intent intent = new Intent();

intent.setClass(Main.this,DialogActivity.class);

 

二、Intent组件对象中存放Map型数据或对Intent对象操作:

intent.putExtra(name, value);//intent中直接放数据

 

 

 

intent.getAction();

三、当前Activity执行Intent:(前提:intent.resolveActivity(getPackageManager()) != null)

startActivity(intent);

或者

startActivityForResult(intent, requestCode)

requestCode--接收该intent的目标view的R.java中的id

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics