赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 手持终端

首页 > 专业技术 > 手持终端 > Android应用程序模型及组件
Android应用程序模型及组件

Android系统中由不同的组件来管理应用程序,按照功能的不同可以分为Activity、Service、Content Provide和Broadcast Receiver四类组件。组件之间通过Intent来完成通信,应用程序通过View来向用户展示可视化的界面。正是这些不同的组件将Android程序的各个部分联系在一起,构成一个完整的功能。

1.Activity类:活动程序

Activity活动程序是Android系统中最基本、最常用的工作组件,直观上Activity活动程序相当于用户看到的手机界面。一个Android应用程序可以包含一个或多个Activity,每个Activity都是独立的。Activity主要由Activity类来管理,主要包含一些设置Activity的方法以及与Activity生命周期有关的事件方法。
1)setContentView方法:设置显示的View
该方法用于设置一个Activity显示的View,可以通过指定布局文件的Id,也可以指定View对象来实现。在重载一个Activity的onCreate方法时,必须首先调用该方法为该Activity设置显示的View。语法格式有两种:
public void setContentView(int layoutResId)
public void setContentView(View view)
其中,参数layoutResId为Activity的XML布局文件Id,参数view为View对象。示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstenceState){
super.onCreate(savedInstenceState);
setContentView(R.layout.main);
}
}
通过设置布局文件是设置一个Activity显示View的最主要方式,往往用于一个Activity最开始显示的时候。
2)finish方法:关闭Activity
该方法用于关闭一个Activity,只有当这个Activity中的任务完成时才可以调用该方法结束。该方法常用于退出Android应用程序的场合。示例:
Button btn1=(Button)findViewById(R.id.button1);
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
finish();
}
});
3)startActivity方法:启动一个Activity
该方法用于启动另外一个Activity,在程序中主要通过传递Intent对象来实现。该方法是启动另外一个Activity的主要方法,往往用于多个Activity界面之间的切换,是多用户界面程序必须的方法。语法格式:
public void startActivity(Intent intent)
其中,参数intent为传递的Intent对象。示例:
Button btn1=(Button)findViewById(R.id.button1);
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Uri uri=Uri.parse("tel:10086");
Intent intent=new Intent(Intent.ACTIVITY_DIAL,uri);
startActivity(intent);
}
});
4)setTitle方法:设置标题
该方法用于设置一个Activity的标题内容。在默认情况下,一个Activity的标题是由AndroidManifest.xml文件指定的,一般是app_name字符串指定的内容。程序中,主要通过该方法来动态设置标题内容。语法格式有两种:
public void setTitle(int titleId)
public void setTitle(CharSequence title)
其中,参数titleId表示字符串的资源Id,参数title表示字符串内容。
5)setTitleColor方法:设置标题颜色
该方法用于设置一个Activity标题的颜色。语法格式:
public void setTitleColor(int textColor)
其中,参数textColor表示标题字符串的颜色值,int为整型数据。
6)onKeyDown方法:响应按钮按下
该方法用于响应按键按下,按键包括键盘按键、方向键等。在Android程序中,必须重载onKeyDown方法才能响应按键按下的信息。语法格式:
public boolean onKeyDown(int keyCode,KeyEvent event)
其中,参数keyCode为被按下按键的键值,也就是键盘码,Android为每一个按键都提供了单独的键盘码,以便知道是哪个按键被按下;参数event为按键事件的对象,Android将其封装成KeyEvent对象,其中包含了事件状态、事件类型、事件发生的时间等信息。示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstenceState){
super.onCreate(savedInstenceState);
setContentView(R.layout.main);
}
}
@override
public boolean onKeyDown(int keyCode,KeyEvent event){
switch(keyCode){
case KeyEvent.KEYCODE_DPAD_UP: //向上方向键
Toast.makeText(getApplicationContext(),"按下了向上方向键",
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_DOWN: //向下方向键
Toast.makeText(getApplicationContext(),"按下了向下方向键",
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_LEFT: //向左方向键
Toast.makeText(getApplicationContext(),"按下了向左方向键",
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_RIGHT: //向右方向键
Toast.makeText(getApplicationContext(),"按下了向右方向键",
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_CENTER: //中间方向键
Toast.makeText(getApplicationContext(),"按下了中间方向键",
Toast.LENGTH_LONG).show();
break;
}
return super.onKeyDown(keyCode,event);
}
7)onKeyUp方法:响应按钮弹起
该方法用于响应按键弹起,按键包括键盘、方向键等。在Android程序中,必须重载onKeyUp方法才能够响应按键弹起的信息。语法格式:
public boolean onKeyUp(int keyCode,KeyEvent event)
其中,参数keyCode为被弹起按键的键值,也就是键盘码,Android为每一个按键都提供了单独的键盘码,以便知道是哪个按键被按下及弹起;参数event为按键事件的对象,Android将其封装成KeyEvent对象,其中包含了事件状态、事件类型、事件发生的时间等信息。
8)onTouchEvent方法:响应触摸事件
该方法用于响应Activity的触摸事件。当用户点击或者触摸程序界面之后,将触发该事件。应用程序中可以针对用户的点击或者触摸来进行相应的处理。语法格式:
public boolean onTouchEvent(MotionEvent event)
其中,参数event为MotionEvent类型,该对象封装了触摸位置、触摸类型和触摸事件等信息。示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstenceState){
super.onCreate(savedInstenceState);
setContentView(R.layout.main);
}
}
@override
public boolean onTouchEvent(MotionEvent event){
int action=event.getAction();
if(action==MotionEvent.ACTION_CANCEL||action==MotionEvent.ACTION_DOWN
||action==MotionEvent.ACTION_MOVE) return false;
int x=(int)event.getX();
int y=(int)event.getY();
Toast.makeText(getApplicationContext(),"点击的坐标为:("+x+","+y+")",
Toast.LENGTH_LONG).show();
return super.onTouchEvent(event);
}
9)onCreate方法:初始化Activity
该方法用于初始化Activity,例如创建View、绑定信息或恢复信息等。onCreate方法是Activity启动后第一个被调用的函数,是应用程序的最重要入口。语法格式:
public void onCreate(Bundle savedInstanceState)
其中,参数savedInstanceState为传入的已保存Activity状态信息,是一个Bundle类型的数据。
10)onStart方法:启动Activity
该方法用于启动Activity。当Activity显示在屏幕上时,该函数被调用。语法格式:
protected void onStart()
示例:
@Override
protected void onStart(){
super.onStart();
}
11)onResume方法:恢复Activity
该方法用于当Activity能够与用户交互,并接受用户输入时被调用。该Activity处于Android Activity栈的栈顶。语法格式:
protected void onResume()
12)onPause方法:暂停Activity
当Activity进入暂停状态时,该方法被调用。一般用来保存持久的数据或释放占用的资源。语法格式:
protected void onPause()
13)onStop方法:停止Activity
当Activity进入停止状态时,该方法被调用。语法格式:
protected void onStop()
14)onRestart方法:重新启动Activity
当Activity从停止状态进入活动状态前,调用该方法。语法格式:
protected void onRestart()
15)onDestroy方法:销毁Activity
在Activity被终止前,即进入非活动状态前,该方法被调用
protected void onDestroy()

2.Intent类:激活组件

Intent在Android操作系统中具有很重要的地位,负责连接两个不同的组件,这是一种运行时的绑定机制。应用程序的多个Activity就是通过Intent来进行跳转的,Intent还可以启动一个Service服务,也可以发起一个Broadcast广播。
Intent由Action、Data、Category、Type、Component和Extra组成,通过这些便可以启动其他组件并传递信息。Intent类负责管理这些数据,并提供了Intent的所有方法。
1)setComponent方法:设置组件名称
该方法用于设置一个Intent对象需要查找的组件名称,输入参数为ComponentName类型的对象。这种方法是直接通过组件名称来查找的,属于显式查找的一种,组件名称应该包括包名和类名,主要在AndroidManifest.xml文件中声明。语法格式:
public Intent setComponent(ComponentName component)
其中,参数component为ComponentName类型的对象,代表了需要查找的组件名称。
2)setClass方法:设置查找的类
该方法用于设置一个Intent对象需要查找的类对象,输入参数为上下文和类对象。这种方法是直接通过类对象来查找的,属于显式查找的一种。语法格式:
public Intent setClass(Context packageContext,class<?> cls)
其中,参数packageContext为上下文;参数cls为需要查找的类。示例:
intent.setClass(getApplicationContext(),secondActivity.class);
3)setClassName方法:设置查找的类名称
该方法用于设置一个Intent对象需要查找的类名称,输入参数为上下文和类名称。这种方式就是直接通过类名称来查找的,属于显式查找的一种。类名称应该包括包名和类名的全部信息。语法格式有两种:
public Intent setClassName(Context packageContext,String className)
public Intent setClassName(String packageName,String className)
其中,packageContext为上下文;packageName为包名称;className为需要查找的类名称,应该包括包名和类名的全部信息。示例:
intent.setClassName(getApplicationContext(),"iflab.test.secondActivity");
intent.setClassName("iflab.test","iflab.test.secondActivity");
4)getIntent方法:获取Intent对象
该方法用于获取Intent对象。当通过Intent启动其他组件后,可以使用该方法得到Intent对象,并获取相应的信息。语法格式:
public Intent getIntent()
5)getComponent方法:获取组件名称
该方法用于获取Intent对象的组件名称。当通过Intent启动其他组件后,可以使用该方法得到Intent对象的组件名称信息。语法格式:
public ComponentName getComponent()
示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1=(Button)findViewById(R.id.button1);
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
ComponentName componentName=new
ComponentName(firstActivity.this,"iflab.test.secondActivity");
Intent intent=new Intent();
intent.setComponent(componentName);
startActivity(intent);
}
});
}
}
secondActivity的代码:
public class secondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
TextView tv=(TextView)findViewById(R.id.textView3);
Intent intent=this.getIntent();
ComponentName componentName=intent.getComponent();
String packageName=componentName.getPackageName();
String className=componentName.getClassName();
tv.setText("包名称:"+packageName+"\n");
tv.append("类名称:"+className);
}
}
6)setAction方法:设置Action
该方法用于设置一个Intent对象的Action。Action指定了Intent对象需要完成的动作,在Android系统中Action是一个String类型的字符串变量。用户可以自己定义Action变量,也开始使用Intent类内部预定义的Action常量。语法格式:
public Intent setAction(String action)
其中,参数action为需要设置的动作,可以是自定义的Action变量,也可以是Intent类内部预定义的Action常量。Intent类内部预定义的Action常量如下:


常量名称

常量值

意义

ACTION_MAIN

android.intent.action.MAIN

Android应用程序的入口

ACTION_VIEW

android.intent.action.VIEW

向用户显示数据

ACTION_ATTACH_DATA

android.intent.action.ATTACH_DATA

指明附加其他地方的一些数据

ACTION_EDIT

android.intent.action.EDIT

显示可编辑的数据

ACTION_PICK

android.intent.action.PICK

选择数据

ACTION_CHOOSER

android.intent.action.CHOOSE

显示一个Activity选择器

ACTION_GET_CONTENT

android.intent.action.GET_CONTENT

获得内容

ACTION_DIAL

android.intent.action.DIAL

显示电话拨号面板

ACTION_CALL

android.intent.action.CALL

直接拨打电话

ACTION_SEND

android.intent.action.SEND

直接发送短信

ACTION_SENDTO

android.intent.action.SENDTO

选择发送短信

ACTION_ANSER

android.intent.action.ANSER

应答电话

ACTION_INSERT

android.intent.action.INSERT

插入数据

ACTION_DELETE

android.intent.action.DELETE

删除数据

ACTION_RUN

android.intent.action.RUN

运行数据

ACTION_SYNC

android.intent.action.SYNC

同步数据

ACTION_PICK_ACTIVITY

android.intent.action.PICK_ACTIVITY

选择Activity

ACTION_SEARCH

android.intent.action.SEARCH

搜索

ACTION_WEB_SEARCH

android.intent.action.WEB_SEARCH

Web搜索

ACTION_FACTORY_TEST

android.intent.action.FACTORY_TEST

工厂测试入口

7)getAction方法:获取Action
该方法用于获取一个Intent对象的Action。该方法的返回值是一个字符串。语法格式:
public String getAction()
示例:
public class firstActivity extends Activity{
public static final String MY_ACTION="iflab.test.MY_ACTION";
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1=(Button)findViewById(R.id.button1);
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
ComponentName componentName=new
ComponentName(firstActivity.this,"iflab.test.secondActivity");
Intent intent=new Intent();
intent.setAction(MY_ACTION);
startActivity(intent);
}
});
}
}
secondActivity的代码:
public class secondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
TextView tv=(TextView)findViewById(R.id.textView3);
Intent intent=this.getIntent();
String action=intent.getAction();
tv.setText(action);
}
}
为了能够启动secondActivity,在AndroidManifest.xml中需要进行相关定义:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="iflab.test"
android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".firstActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="secondActivity">
<intent-filter>
<action android:name="iflab.test.MY_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.CALL_PHONE" />
</manifest>
8)addCategory方法:添加附加信息

该方法用于为Intent对象在执行一个Action时添加附加信息。例如,CATEGORY_ LAUNCHER表示在启动程序时,该Activity第一个被调用;CATEGORY_HOME表示回到HOME主界面。在Android系统中,将寻找与设置的Action和Category相同的组件,并将其启动。常用的Category属性有:

CATEGORY_DEFAULT

默认的执行方式,按照普通Activity的执行方式执行

CATEGORY_HOME

该组件为Home Activity

CATEGORY_LAUNCHER

优先级最高的Activity,通常与入口ACTION_MAIN配合使用

CATEGORY_BROWSABLE

可以使用浏览器启动

CATEGORY_INFO

提供包信息

CATEGORY_GADGET

可以内嵌到另外Activity中

CATEGORY_TAB

如果需要作为TabActivity的选项卡,则进行设置

CATEGORY_PREFERENCE

如果Activity是一个偏好面板,则进行设置

CATEGORY_ALTERNATIVE

如果Activity作为用户正在查看数据的备用动作,则进行设置

CATEGORY_SELECTED_ALTERNATIVE

如果Activity作为用户正在当前选择数据的备用动作,则进行设置

CATEGORY_DESK_DOCK

如果设备插入到desk dock时运行Activity,则进行设置

CATEGORY_CAR_DOCK

如果设备插入到car dock时运行Activity,则进行设置

CATEGORY_TEST

如果用于测试,则进行设置

CATEGORY_LE_DESK_DOCK

如果设备插入到模拟低端dock时运行Activity,则进行设置

CATEGORY_HE_DESK_DOCK

如果设备插入到模拟高端dock时运行Activity,则进行设置

CATEGORY_CAR_MODE

如果Activity可以用于汽车环境,则进行设置

CATEGORY_APP_MARKET

如果Activity运行用户浏览和下载新应用,则进行设置

语法格式:
public Intent addCategory(String category)
其中,参数category是字符串,代表了Action的附加信息,可以是Intent类预定义的值,也可以是用户自定义的值。示例:
public class firstActivity extends Activity{
public static final String MY_ACTION="iflab.test.MY_ACTION";
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1=(Button)findViewById(R.id.button1);
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
ComponentName componentName=new
ComponentName(firstActivity.this,"iflab.test.secondActivity");
Intent intent=new Intent();
intent.setAction(ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
}
});
}
}
9)putExtra方法:设置扩展信息
该方法用于为Intent对象在执行一个Action时添加扩展信息。扩展信息采用的是键值对的形式,键采用字符串的形式,而值则可以采用多种形式,例如字符串、布尔型、整型、浮点型、字符、字节等。语法格式有多种:
public Intent putExtra(String name,String value)
public Intent putExtra(String name,Boolean value)
public Intent putExtra(String name,byte value)
public Intent putExtra(String name,char value)
public Intent putExtra(String name,CharSequence value)
public Intent putExtra(String name,double value)
public Intent putExtra(String name,float value)
public Intent putExtra(String name,int value)
public Intent putExtra(String name,long value)
public Intent putExtra(String name,short value)
其中,参数name为扩展信息的键信息;参数value为扩展信息的键信息,可以采用多种形式,例如字符串、布尔型、整型、长整型、浮点型、字符、字节等。
10)getStringExtra方法:获取扩展信息
该方法用于获取Intent的扩展信息。扩展信息采用的是键值对的形式,键采用字符串的形式,而值可以采用多种形式。该方法用于接收putExtra方法设置的键值。语法格式:
public String getStringExtra(String name)
其中,参数name表示需要获取键值对的键名称,字符串形式。
11)setData方法:设置数据
该方法用于设置Intent的Action动作的数据。数据采用的是Uri类型,不同的ACTION动作需要的数据格式不同。因此,一定要赋予匹配的Data数据,否则将出错。语法格式:
public Intent setData(Uri data)
其中,参数data为设置的数据,Uri格式。不同的ACTION动作需要的数据格式不同,见表:


ACTION属性名称

Data属性

说明

ACTION_VIEW

content://contact/people/1

显示id为1的联系人信息

ACTION_DIAL

content://contact/people/1

将id为1的联系人的电话号码显示在拨号界面中

ACTION_VIEW

tel:10086

显示电话为10086的联系人信息

ACTION_VIEW

http://www.baidu.com

在浏览器中浏览该网址

ACTION_VIEW

file://sdcard/music.mp3

播放MP3

ACTION_VIEW

geo:40.3156,117.3312

显示地图

示例:启动浏览器
public class firstActivity extends Activity{
public static final String MY_ACTION="iflab.test.MY_ACTION";
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1=(Button)findViewById(R.id.button1);
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent intent=new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri data=Uri.parse("http://www.baidu.com");
intent.setData(data);
startActivity(intent);
}
});
}
}

3.BroadcastReceiver类:广播接收器

BroadcastReceiver类就是Android系统的广播接收器,其运行机制类似于事件处理,但广播接收器是系统级的。在程序中,可以通过sendBroadcast方法来发送系统广播,也可以通过重载BroadcastReceiver类中的onReceive方法来接收系统广播。
1)sendBroadcast方法:发送广播
该方法用于发送一个系统广播,其传递的是Intent对象。如果使用Intent来启动一个Activity,使用的是startActivity方法。语法格式:
public void sendBroadcast(Intent intent)
其中,参数intent为传递的Intent对象。通过为Intent对象设置ACTION动作来表示广播,可以使用自定义的广播,也可以使用系统内部预定义的广播:

常量名称

常量值

意义

ACTION_BOOT_COMPLETED

android.intent.action.BOOT_COMPLETED

系统启动完成后发出一次通知

ACTION_SHUTDOWN

android.intent.action.SHUTDOWN

通知设备已经关闭

ACTION_UID_REMOVED

android.intent.action.UID_REMOVED

通知从设备中删除应用ID值

ACTION_HEADSET_PLUG

android.intent.action.HEADSET_PLUG

插入或者拔出耳机

ACTION_SCREEN_ON

android.intent.action.SCREEN_ON

打开移动设备屏幕

ACTION_DATE_CHANGED

android.intent.action.ACTION_DATE_CHANGED

日期改变

ACTION_TIME_TICK

android.intent.action.ACTION_TIME_TICK

每分钟通知一次时间改变

ACTION_TIME_CHANGED

android.intent.action.ACTION_TIME_CHANGED

时间改变

ACTION_TIMEZONE_CHANGED

android.intent.action.ACTION_TIMEZONE_CHANGED

时区改变

ACTION_BATTERY_LOW

android.intent.action.ACTION_BATTERY_LOW

电量低

ACTION_BATTERY_CHANGED

android.intent.action.ACTION_BATTERY_CHANGED

包含充电状态等的电池信息广播

ACTION_POWER_CONNECTED

android.intent.action.ACTION_POWER_CONNECTED

通知设备已经连接外部电源

ACTION_POWER_DISCONNECTED

android.intent.action.ACTION_POWER_DISCONNECTED

通知设备已经移除外部电源

ACTION_MEDIA_EJECT

android.intent.action.ACTION_MEDIA_EJECT

插入或拔出外部媒体

ACTION_MEDIA_BUTTON

android.intent.action.ACTION_MEDIA_BUTTON

按下手机媒体按钮

ACTION_PACKAGE_ADDED

android.intent.action.ACTION_PACKAGE_ADDED

添加PACKAGE包

ACTION_PACKAGE_CHANGED

android.intent.action.ACTION_PACKAGE_CHANGED

已经安装的PACKAGE包被修改

ACTION_PACKAGE_REMOVED

android.intent.action.ACTION_PACKAGE_REMOVED

删除PACKAGE包

ACTION_PACKAGE_RESTARTED

android.intent.action.ACTION_PACKAGE_RESTARTED

通知用户重启PACKAGE

ACTION_PACKAGE_DATA_CLEARED

android.intent.action.ACTION_PACKAGE_DATA_CLEARED

通知用户清除PACKAGE的数据

2)onReceive方法:接收广播
该方法用于接收系统广播,并响应相应的事件。onReceive方法位于BroadcastReceiver类,使用时需要自定义一个类来继承于BroadcastReceiver类,并重载其中的onReceive方法。语法格式:
public void onReceive(Context arg0,Intent arg1)
其中,参数arg0为正在执行的接收程序的Context对象;arg1为接收到的Intent对象。示例:
public class firstActivity extends Activity{
public static final String MY_ACTION="iflab.test.MY_ACTION";
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1=(Button)findViewById(R.id.button1);
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent intent=new Intent();
intent.setAction(MY_ACTION);
intent.putExtra("message","来自于广播的信息!");
startActivity(intent);
}
});
}
}
代码中为按钮设置了监听器,当按钮被点击时将为Intent对象设置一个自定义ACTION,并设置了广播的消息,然后使用sendBroadcast方法发送该广播。为了在程序中接收广播,还需要声明一个myReceiver类,该类继承于BroadcastReceiver类,同时还需要重载其中的onReceive方法来接收广播并进行处理。代码为:
public class myReceiver extends BroadcastReceiver{
@Override
protected void onReceive(Context arg0,Intent arg1){
String str;
str="接收到的广播消息为:"+arg1.getStringExtra("message");
Toast.makeText(arg0,str,Toast.LENGTH_LONG).show();
}
}
为了能够使用myReceiver类,需要在AndroidManifest.xml中声明myReceiver:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="iflab.test"
android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".firstActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="myReceiver">
<intent-filter>
<action android:name="iflab.test.MY_ACTION" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.CALL_PHONE" />
</manifest>
3)registerReceiver方法:注册广播接收器
该方法用于在程序中动态注册广播接收器。在Android系统中,广播接收器可以在AndroidManifest.xml文件中声明,也可以通过registerReceiver方法在程序中动态注册。注册之后的广播接收器,可以使用unregisterReceiver方法销毁。语法格式:
public Intent registerReceiver(BroadcastReceiver receiver,IntentFilter filter)
其中,参数receiver为BroadcastReceiver的一个实例;参数filter为IntentFilter对象,用于指定接收的广播对象。
4)unregisterReceiver方法:销毁广播接收器
该方法用于在程序中动态销毁广播接收器。在Android系统中,广播接收器可以在AndroidManifest.xml文件中声明,也可以通过registerReceiver方法在程序中动态注册。使用registerReceiver方法注册之后的广播接收器,可以使用unregisterReceiver方法销毁。语法格式:
public void unregisterReceiver(BroadcastReceiver receiver)
其中,参数receiver为BroadcastReceiver的一个实例。示例:
public class firstActivity extends Activity{
public static final String MY_ACTION="iflab.test.MY_ACTION";
myReceiver receiver;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
Button btn3=(Button)findViewById(R.id.button3);
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent intent=new Intent();
intent.setAction(MY_ACTION);
intent.putExtra("message","来自于广播的信息!");
sendBroadcast(intent);
}
});
btn2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
IntentFilter filter=new IntentFilter("iflab.test.MY_ACTION");
receiver=new myReceiver();
registerReceiver(receiver,filter);
}
});
btn3.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
unregisterReceiver(receiver);
}
});
}
}
代码中,为3个按钮设置了监听器。当第一个按钮被点击时,将为Intent对象设置一个自定义的ACTION,并设置了广播的消息,然后使用sendBroadcast方法发送该广播;当第二个按钮被点击时,调用registerReceiver方法来注册广播接收器;当第三个按钮被点击时,调用unregisterReceiver方法来销毁广播接收器。
为了在程序中接收广播,还需要声明一个myReceiver类,该类继承于BroadcastReceiver类,同时还需要重载其中的onReceiver方法来接收广播并进行处理。代码为:
public class myReceiver extends BroadcastReceiver{
@Override
protected void onReceive(Context arg0,Intent arg1){
String str;
str="接收到的广播消息为:"+arg1.getStringExtra("message");
Toast.makeText(arg0,str,Toast.LENGTH_LONG).show();
}
}

4.Notification类:通知

在Android系统中,可以使用Notification类和NotificationManager类来实现可视化的广播信息显示,如广播信息的内容、指示灯闪烁及手机振动等。在Android手机中,屏幕最上方的状态栏便是用于显示Notification通知信息的。
在Android中使用Notification通知的方式比较简单,首先需要获取系统级的服务Notification Manager,然后实例化并设置一个Notification对象,最后通过NotificationManager发送通知即可。
1)setLatestEventInfo方法:设置事件信息
该方法用于设置通知事件的信息,包括通知的标题、通知的内容等。setLatestEventInfo是Notification;类中的方法,在发出通知之前必须首先调用该方法设置事件信息。语法格式:
public void setLatestEventInfo (Context context, CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent)
其中,参数context为上下文;参数contentTitle为通知的标题;参数contentText为通知的内容;参数的contentIntent为PendingIntent对象。
2)notify方法:发出通知
该方法用于发出一个通知。在使用时,需要指定通知的Id和通知对象。notify方法是NotificationManager类的一个方法。语法格式:
public void notify(int id,Notification notification)
其中,参数id为通知的Id,参数notification为通知对象。
3)cancel方法:取消通知
该方法用于取消一个通知。在使用时,只需要指定被取消通知的Id即可。cancel方法是NotificationManager类的一个方法。语法格式:
public void cancel(int id)
其中,参数id代表了被取消通知的Id。示例:
public class firstActivity extends Activity{
public Notification notification;
private NotificationManager notificationManager;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
String service=NOTIFICATION_SERVICE;
notification=new Notification();
notification.icon=R.drawable.icon;
notification.tickerText="Notification测试";
notification.when=System.currentTimeMillis();
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent intent=new Intent(firstActivity.this,firstActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(firstActivity.this,
0,intent,0);
notification.setLatestEventInfo(firstActivity.this,"标题","内容",
pendingIntent);
notificationManager.notify(l,notification);
}
});
btn2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
notificationManager.cancel(l);
}
});
}
}
代码中设置了两个按钮,一个按钮用于发送通知,另一个按钮用于取消通知。

5.AlarmManager类:闹钟

AlarmManager是Android系统提供的一个闹钟服务,这是一种系统级的提示服务,其允许在某个时间到来时执行一个服务。Android系统中的闹钟就是依此来实现的,还可以使用AlarmManager来实现定时提醒等功能。
1)set方法:设置提醒
该方法用于设置闹钟提醒,可以设置提醒的类型、执行闹钟提醒的时间和执行的动作等。set方法是最基本的设置闹钟提醒的方法之一。语法格式:
public void set(int type,long triggerAtTime,PendingIntent operation)
其中,参数type设置提醒类型,可取值见表:


取值

说明

ELAPSED_REALTIME

设置闹钟时间,从Android系统启动开始

ELAPSED_REALTIME_WAKEUP

设置闹钟时间,从Android系统启动开始,如果手机休眠则将其唤醒

INTERVAL_DAY

设置闹钟时间,每隔一天提醒一次

INTERVAL_FIFTEEN_MINUTES

设置闹钟时间,每隔15分钟提醒一次

INTERVAL_HALF_HOUR

设置闹钟时间,每隔半小时提醒一次

INTERVAL_HOUR

设置闹钟时间,每隔一小时提醒一次

RTC

设置闹钟时间,从系统当前时间开始

RTC_WAKEUP

设置闹钟时间,从系统当前时间开始,如果手机休眠则将其唤醒

参数triggerAtTime为执行闹钟提醒的时间;参数operation为PendingIntent对象,代表执行的动作。
示例:设置单次闹钟提醒
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1=(Button)findViewById(R.id.button1);
final AlarmManager alarmManager=(AlarmManager)
getSystemService(ALARM_SERVICE);
Intent intent=new Intent();
intent.setAction(AM_ACTION);
intent.putExtra("message","该下班了!");
final PendingIntent pendingIntent=PendingIntent.getBroadcast
(firstActivity.this,0,intent,0);;
final long time=System.currentTimeMillis();;
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
alarmManager.set(AlarmManager.RTC_WAKEUP,time,pendingIntent);
}
});
}
}
为了响应闹钟提醒,要用到BroadcastReceiver广播接收器来接收提醒,代码为:
public class myReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context arg0,Intent arg1){
String str;
str="触发单次闹钟:"+arg1.getStringExtra("message");
Toast.makeText(arg0,str,Toast.LENGTH_LONG).show();
}
}
为了能够使用myReceiver类,还需要在AndroidManifest.xml文件中声明,代码为:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="iflab.test"
android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".firstActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="myReceiver">
<intent-filter>
<action android:name="iflab.test.AM_ACTION" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.CALL_PHONE" />
</manifest>
2)setRepeating方法:设置精确重复提醒
该方法用于设置精确的重复闹钟提醒,可以设置提醒的类型、执行闹钟提醒的时间和执行的动作等。这是最基本的设置闹钟提醒的方法之一。语法格式:
public void setRepeating(int type,long triggerAtTime,long interval,PendingIntent operation)
其中,参数type设置提醒类型;参数triggerAtTime为执行闹钟提醒的时间;参数interval为重复提醒的间隔时间;参数operation为PendingIntent对象,代表执行的动作。示例:
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,time,8*1000,pendingIntent);
3)setInexactRepeating方法:设置不精确的重复提醒
该方法用于设置不精确的重复闹钟提醒,可以设置提醒的类型、执行闹钟提醒的时间和执行的动作等。这是最基本的设置闹钟提醒的方法之一。语法格式:
public void setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
其中,参数type设置提醒类型;参数triggerAtTime为执行闹钟提醒的时间;参数interval为重复提醒的间隔时间;参数operation为PendingIntent对象,代表执行的动作。示例:
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,time,8*1000,pendingIntent);
4)cancel方法:取消提醒
该方法用于取消设置的闹钟提醒,是取消闹钟提醒的主要方法,特别是在重复提醒的场合,必须调用cancel方法来取消闹钟提醒,否则将一直提醒。语法格式:
public void cancel(PendingIntent operation)
其中,参数operation为PendingIntent对象,代表闹钟执行的动作。示例:
public class firstActivity extends Activity{
private static final String AM_ACTION="iflab.test.AM_ACTION";
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
final AlarmManager alarmManager=(AlarmManager)
getSystemService(ALARM_SERVICE);
Intent intent=new Intent();
intent.setAction(AM_ACTION);
intent.putExtra("message","该下班了!");
final PendingIntent pendingIntent=PendingIntent.getBroadcast
(firstActivity.this,0,intent,0);;
final long time=System.currentTimeMillis();;
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,time,8*1000,
pendingIntent);
}
});
btn2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
alarmManager.cancel(pendingIntent);
}
});
}
}

6.Service类:服务

Service是Android系统中运行在后台的一种服务程序,没有提供可以与用户交互的可视化界面。Service的用法类似于BroadcastReceiver,需要定义一个继承于Service的类,然后重载其中的生命周期函数,并且还需要在AndroidManifest.xml文件中声明才能使用。Service类实现了Service服务的声明周期和各项功能。
1)onBind方法:绑定服务
该方法是Service的生命周期函数,用于绑定Service服务的时候被调用。用户可以重载该方法,实现Service服务被绑定时候的操作。语法格式:
public IBinder onBind(Intent arg0)
其中,参数arg0是传入的Intent对象。示例:
@Override
public IBinder onBind(Intent arg0){
return null;
}
2)onCreate方法:创建服务
该方法是Service的生命周期函数,用于创建Service服务的时候被调用。用户可以重载该方法,实现Service服务被创建时候的操作。语法格式:
public void onCreate()
示例:
@Override
public void onCreate(){
super.onCreate();
}
3)onDestroy方法:销毁服务
该方法是Service的生命周期函数,用于销毁Service服务的时候被调用。用户可以重载该方法,实现Service服务被销毁时候的操作。语法格式:
public void onDestroy()
4)onStart方法:启动服务
该方法是Service的生命周期函数,用于启动Service服务时被调用。用户可以重载该方法,实现Service服务被启动时候的操作。语法格式:
public void onStart(Intent intent,int startId)
其中,参数intent为传入的Intent对象;startId为启动的Id。
5)startService方法:启动Service对象
该方法用来启动一个Service服务对象。执行该方法后,系统将调用启动Service服务,并执行onStart方法。如果是第一次执行服务,还将执行onCreate方法创建Service服务。语法格式:
public ComponentName startService(Intent service)
其中,参数service是Intent对象,其中设置了Service的Action动作。
6)stopService方法:停止Service对象
该方法用来停止一个Service服务对象。执行该方法之后,系统将调用销毁Service服务,并执行onDestroy方法。
public boolean stopService(Intent name)
其中,参数name是Intent对象,其中设置了Service的Action动作。示例:
public class firstActivity extends Activity{
private static final String MY_SERVICE="iflab.test.MY_SERVICE";
public static TextView logview
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
logview=(TextView)findViewById(R.id.textView2);
logview.setTextColor(Color.BLACK);
logview.setTextSize(16);
logview.setText("Service方法调用过程:\n");
Intent intent=new Intent();
intent.setAction(MY_SERVICE);
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
startService(intent);
}
});
btn2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
stopService(intent);
}
});
}
}
还需要声明一个myService类,该类继承于Service类,同时还需要重载其中的生命周期方法并进行处理,代码为:
public class myService extends Service{
@Override
public IBinder onBind(Intent arg0){
iflab.test.firstActivity.logview.append("调用了myService的onBind方法!\n");
return null;
}
public void onCreate(){
iflab.test.firstActivity.logview.append("调用了myService的onCreate方法!\n");
super.onCreate();
}
public void onDestroy(){
iflab.test.firstActivity.logview.append("调用了myService的onDestroy方法!\n");
super.onDestroy();
}
public void onStart(Intent intent,int startId){
iflab.test.firstActivity.logview.append("调用了myService的onStart方法!\n");
super.onStart(intent,startId);
}
}
为了能够使用myService类,需要在AndroidManifest.xml文件中声明myService类service,代码为:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="iflab.test"
android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".firstActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="myService">
<intent-filter>
<action android:name="iflab.test.MY_SERVICE" />
</intent-filter>
</service>
</application>
<uses-permission android:name="android.permission.CALL_PHONE" />
</manifest>
7)bindService方法:绑定Service
该方法用来绑定一个Service服务对象。执行该方法后,系统将调用启动Service服务,并执行onStart方法。如果是第一次执行服务,还将执行onCreate方法创建Service服务。语法格式:
public boolean bindService(Intent service,ServiceConnection conn,int flags)
其中,参数service为Intent对象,其中设置了Service的Action动作;参数conn为连接对象,当Service启动或停止时用于接收信息;flags为绑定Service的操作方式,可以取值为0、BIND_AUTO_CREATE、BIND_DEBUG_UNBIND、BIND_NOT_FOREGROUND。
8)unbindService方法:解除绑定Service
该方法用来解除绑定一个Service服务对象。执行该方法后,系统将调用销毁Service服务,并执行onDestroy方法。语法格式:
public void unbindService(ServiceConnection conn)
其中,参数conn为该Service设置的连接对象。示例:
public class firstActivity extends Activity{
private static final String MY_SERVICE="iflab.test.MY_SERVICE";
public static TextView logview
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
Button btn3=(Button)findViewById(R.id.button3);
Button btn4=(Button)findViewById(R.id.button4);
logview=(TextView)findViewById(R.id.textView2);
logview.setTextColor(Color.BLACK);
logview.setTextSize(16);
logview.setText("Service方法调用过程:\n");
Intent intent=new Intent();
intent.setAction(MY_SERVICE);
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
startService(intent);
}
});
btn2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
stopService(intent);
}
});
final ServiceConnection serviceConnection=new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName arg0,IBinder arg1){
logview.append("Service连接成功!\n");
}
public void onServiceDisconnected(ComponentName name){
logview.append("Service断开连接!\n");
}
});
btn3.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
bindService(intent,serviceConnection,Service.BIND_AUTO_CREATE);
}
});
btn4.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
unbindService(serviceConnection);
}
});
}
}

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659