Ourren

关注技术,记录生活.

Android组件概要

| 留言

记得最初看android基础还是去年这个时候,时隔一年基本上忘得差不多了。近期由于研究android恶意代码分析相关技术,需要对android各类组件有更深入的理解,个人总结如下:

Activity Activity是Android构造块中最基本的一种,在应用中,一个activity通常就是一个单独的屏幕。每一个activity都被实现为一个独立的类,并且继承于Activity这个基类。这个activity类将会显示由几个Views控件组成的用户接口,并对事件做出响应。大部份的应用都会包含多个的屏幕。 通俗点:界面都是通过继承Activity类来实现的,然后重写oncreate函数实现初始化界面显示。多个Activity类之间是通过intent类来实现切换的。一般需要新建一个Intent类,然后调用相关成员函数传值。 实例代码如下: [code lang=“java”]Intent intent=new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse(“tel:1320010001”); startActivity(intent);[/code] 通过intent和startActivity实现activity的切换。

Service 系统服务,接触过window编程方面就知道服务进程的话都是后台运行,android上的service组件也一样,一般用于后台运行程序。比如说我们可以同时上网和听歌,那么就可以把听歌这个activity采用service运行方式。一般需要调用Context.startService()或Context.bindService()方法启动服务。 代码实现的时候需要在manifest中声明服务。可以采用如下方法: [code lang=“java”]<service android:name=“.PlayService” />[/code] PlayService是Service类的名字。 类实现关键代码: [code lang=“java”]@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.startService(new Intent(this, PlayService.class)); }[/code] Content Provider 内容提供者,作为应用程序之间唯一的共享数据的途径,Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的借口。 让自己的数据和其他应用程序共享有两种方式:创建自己的Content Provier(即继承自ContentProvider的子类)  或者是将自己的数据添加到已有的Content Provider中去,后者需要保证现有的Content Provider和自己的数据类型相同且具有该 Content Provider的写入权限。对于Content Provider,最重要的就是数据模型(data model) 和 URI。

Broadcast Receiver 广播接收器:Broadcast Receiver组件提供了一种把Intent作为一个消息广播出去,由所有对其感兴趣的程序对其作出反应的机制。它和时间处理机制类似,但是事件处理机制是程序组件级别的(比如:按钮的单击事件),而广播事件处理机制是系统级别的。我们可以用Intent来启动一个组件,也可以用sendBroadcast()方法发起一个系统级别的事件广播来传递消息。我们同样可以在自己的应用程序中实现Broadcast Receiver来监听和响应广播的Intent。 可以使用两种方式来进行操作:静态注册、动态注册。 静态注册: 在AndroidManifest.xml中用标签生命注册,并在标签内用标签设置过滤器,但是使用这种注册方式注册了之后,即使程序已经关闭或者没有开启,都将接收到匹配的广播,因此这里就存在安全问题,恶意程序可以注册android.provider.Telephony.SMS_RECEIVED类似的广播实现偷取短信。 代码如下,将NEW_LIFEFORM类型广播绑定到MyBroadcastReceiver类: [code lang=“java”]//AndroidManifest.xml中代码 <receiver android:name=“.MyBroadcastReceiver”> <intent-filter> <action android:name=“com.android.broadcasttest.NEW_LIFEFORM” /> </intent-filter> </receiver>

//接受关键代码 public class MyBroadcastReceiver extends BroadcastReceiver { public static final String BURN = “com.paad.alien.action.BURN_IT_WITH_FIRE”;

public MyBroadcastReceiver () { Log.v(“BROADCAST_TAG”, “myBroadCast”); } @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Toast.makeText(context, “成功接收广播:”, Toast.LENGTH_LONG).show(); }

}

//发送关键代码 public class BroadcastTest extends Activity { public static final String NEW_LIFEFORM_DETECTED = “com.android.broadcasttest.NEW_LIFEFORM”;

/* Called when the activity is first created. / @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

Button btn0 = (Button)findViewById(R.id.btn0); btn0.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent it = new Intent(NEW_LIFEFORM_DETECTED); sendBroadcast(it); } }); } }[/code] 动态注册,通过registerReceiver和unRegisterReceiver实现注册和解除: [code lang=“java”] IntentFilter filter = new IntentFilter(“android.provider.Telephony.SMS_RECEIVED”); // MyReceiver receiver = new MyReceiver(); registerReceiver(receiver, filter);[/code] Intent Android使用了Intent这个特殊类,实现在屏幕与屏幕之间移动。Intent类用于描述一个应用将会做什么事。在Intent的描述结构中,有两个最重要的部分:动作和动作对应的数据。典型的动作类型有:MAIN(activity的门户)、VIEW、PICK、EDIT等。而动作对应的数据则以URI的形式进行表示。你可以在Intent中指定程序要执行的动作(比如:view,edit,dial),以及程序执行到该动作时所需要的资料。都指定好后,只要调用startActivity(),Android系统会自动寻找最符合你指定要求的应用程序,并执行该程序。例如:要查看一个人的联系方式,你需要创建一个动作类型为VIEW的intent,以及一个表示这个人的URI。

intent-filter 与之有关系的一个类叫IntentFilter。相对于intent是一个有效的做某事的请求,一个intent filter则用于描述一个activity(或者Intent Receiver)能够操作哪些intent。什么时候启动或者触发函数。