手持终端
Eclipse平台下Android开发环境的搭建
PhoneGap配置到Eclipse开发环境
使用PhoneGap开发Android应用程序
PhoneGap3.0以上版本配置到Eclipse开发环境
使用PhoneGap3.0版本开发Android应用程序
PhoneGap3.0的第三方Android插件
Cordova配置到Android Studio开发环境
Android系统基本架构
Android的字符串颜色图片样式
Android的常用控件及菜单
Android的消息提示及传递
Android系统的组件通信
Android系统的Service
Android的广播消息接收
Android的数据存储与访问
Android系统的网络应用
Android图形图像处理
Android的Fragment框架
Android系统的并发编程
Java源文件结构与保留字
Java语言的数据类型与变量
Java的运算符与流程控制
Java语言的数组及操作
Java面向对象编程
Java的常用类
Android开发常用工具及命令
Android应用程序权限管理
Android系统提供的R类内置资源
Android系统的控件类及其方法
Android系统的菜单类及其方法
Android系统的对话框
Android应用程序模型及组件
Android的绘图类及方法
Android系统的动画效果
Android的数据库操作
Android的多媒体功能
Android系统照相机的使用
Android的文本朗读TTS
获取Android系统信息
Android系统的电话操作
Android系统的定位
Android系统的传感器
1.消息提示Toast:
某些情况下需要向用户弹出提示消息以提醒用户,Android提供了消息提示框Toast,这类提示框会随着设定的时间自动消失,而不会获得焦点。
Toast可以通过makeText()方法创建Toast对象并设置相关属性,并调用show()方法显示提示。示例:
Toast.makeText(TextViewDemoActivity.this,"注册成功",Toast.LENGTH_LONG).show();
示例中是一种比较简单的消息提示,若希望功能更丰富的提示框,则需要使用构造器创建Toast对象,然后调用相关方法设置提示框内容、位置等信息:
Toast toast=new Toast(TextViewDemoActivity.this);
toast.setGravity(Gravity.CENTER,0,180);
ImageView image=new ImageView(TextViewDemoActivity.this);
iamge.setImageResource(R.drawable.ok2);
LinearLayout layout=new LinearLayout(TextViewDemoActivity.this);
layout.addView(image);
TextView txt=new TextView(TextViewDemoActivity.this);
txt.setText("注册成功!");
txt.setTextSize(16);
layout.addView(txt);
toast.setView(layout);
toast.setDuration(Toast.LENGTH_LONG);
toast.show();
代码中创建了一个空Toast对象,并设置了Toast的显示时间及位置属性,通过自定义的一个线性布局添加到Toast中作为显示内容,实现了一个自定义带图片显示并且自定义位置的消息提示。
2.Handler消息传递机制:
在Android中,只允许主线程对UI进行修改,其他线程可以借助Handler与主线程之间进行消息传递。应用程序启动时,Android首先需要开启一个主线程(即UI线程),主线程管理界面中的UI控件进行事件分发,如单击Button,Android系统会分发事件到Button上,来响应用户的操作。
1)Handler类:
Handler类是一个消息处理类,主要用于异步消息的处理。
更新UI只能在主线程中进行,子线程可以借助Handler对象的sendMessage()方法来传递消息(Message对象),子线程把这些消息放入主线程队列中。Handler可以对主线程队列中的Message对象依次作处理,Message对象中封装了数据,Handler可以解析出Message对象中封装的数据对UI进行更新。
Handler在整个消息传递机制中主要其两个作用,在新启动的线程中发送消息,在主线程中获取、处理消息。Handler类通过如下方法来发送、处理消息:
·void handleMessage(Message msg):处理消息的方法,线程通过重写该方法来处理消息
·final boolean hasMessage(int what):检查队列中是否包含what属性为指定值的消息
·final boolean hasMessage(int what,Object object):检查队列中是否包含what属性为指定值和指定对象的消息
·Message obtainMessage():获取消息,可被多种方式重载
·sendEmptyMessage(int what):发送空消息
·final boolean sendEmptyMessageDelayed(int what,long delayMillis):指定多少毫秒后发送空消息
·final boolean sendMessage(Message msg):携带消息立刻发送消息
·final boolean sendMessageDelayed(Message msg,long delayMillis):指定多少毫秒之后携带消息发送消息
2)Looper:
循环对象Looper用于为一个线程开启一个消息队列(MessageQueue),循环等待其他线程发送消息,当有消息时会唤起线程来处理消息,直到线程结束为止。通常情况下,Android中并不会为新线程开启消息循环,不会用到Looper,但系统自动为主线程创建一个Looper对象,并创建消息队列,所以主线程会一直运行,以处理用户事件,直至退出。
当需要一个线程时,这个线程要能循环处理其他线程发来的消息事件,或者需要长期与其他线程进行复杂的交互,这时就需要用到Looper来为线程建立消息队列。
Looper对象提供了以下几个方法:
·prepare():用于初始化Looper,prepare()方法保证每个线程至多只有一个Looper对象
·loop():用于开启消息循环,当调用了loop()方法后,Looper线程就真正开始工作,会从消息队列中获取消息并交给对应的Handler对象处理消息
·quit():用于结束Looper消息循环
3)Message:
消息类Message是能够发送给Handler并由Handler处理的消息对象,它包含了消息的描述和任意数据对象。一个Message对象拥有5个属性:
属性名称 |
类型 |
描述 |
arg1 |
int |
用于存放整型数据 |
arg2 |
int |
用于存放整型数据 |
obj |
Object |
用于存放发送给接收器的Object类型的对象 |
replyTo |
Message |
用来指定此Message发送到何处的可选Message对象 |
what |
int |
用于指定用户自定义的消息代码 |
4)消息传递机制:
使用Handler发送消息,消息被传送到指定的MessageQueue。为了保证正常工作,当前线程必须有MessageQueue,而MessageQueue是由Looper对象来管理的。因此要求当前线程必须有一个Looper对象,分两种情况:
·主线程:系统已经为其初始化了Looper对象,因此可以直接创建Handler对象,并由该Handler对象发送、处理消息
·非主线程:需先调用Looper的prepare()方法创建一个Looper对象,然后调用Looper的loop()方法启动
当线程有了Looper对象之后,再创建Handler子类的实例,,重写handleMessage()方法处理消息,最后由loop()启动Looper对象。
3.使用状态栏传递信息:
通过使用Android状态区传递特定事件以便得到用户关注。有时候不需要一直开启应用,当有信息进来时程序能通过信息传递方法告知用户切换回这个程序,以查看更新的信息。状态栏通知并不一定是Activity方式的,而可能是其他组件所发送出来的状态栏信息提示,在用户按下这个状态栏提示信息时才会进入其所使用的Activity。
这类由状态栏提供的信息,通常由没有UI服务组件或广播组件所产生,为了在项目中实现这样的功能,可以新增一个Activity,并在程序中新增一个Service,当程序加载时会调用执行这个Service,并让这个Service产生一个状态栏信息。无论用户何时看到状态栏信息,只要下拉状态栏并单击打开详细信息,就会回到所设置的另一个Activity。
要使用状态栏,需要一个比较复杂的配合设置和编程。
1)新增一个服务Service:
新增Java项目,Superclass必须继承android.app.Service,使用New Java Class界面中的Superclass后面的Brower按钮,在Choose a type中输入Service,单击android.app,生成一个Service类。
然后打开AndroidManifest.xml,将这个Service添加进去。首先点击左下角的Application标签,在出现的界面下面的Application Nodes栏右侧点击Add按钮,在出现的列表中选择Service,然后点击右侧出现的Attribute for Service中Name右侧Browse按钮,选择由于前面的设定而出现的class名。
2)新增一个返回的Activity:
需要先创建一个Layout的XML文件(如bill.xml),一般需要在strings.xml中进行配合设置以显示文字信息。
然后新建一个Activity的java文件,核心代码为:
public class Bill extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bill);
}
}
其中使用了名bill.xml的Layout文件。
然后在AndroidManifest.xml中添加这个Activity。
3)调用状态栏的用户告知:
需要把一个图标文件放置到res下的drawable-nodpi中。然后要引用NotificationManager,添加Notification,并设置要显示在状态栏上的图标,然后继续设置当信息被用户展开时要呈现的标题、内文与相关的Intent,再定义将要出现的用户接口Activity。最后设置这个信息通知一个ID,如果同一个ID又被重新发送一次不会产生新的图标,而是更新它的内容。这部分代码加入Service的onCreate()函数中。
4)在主Activity中调用服务:
要启动一个服务,只需要设置一个Intent给该服务的类,再调用startService即可。核心代码为:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent i=new Intent(this,Notify.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startService(i);
}
执行后,状态栏就会出现设置的图标。
5)定制用户下拉状态栏的信息:
可以使用页面配置xml文件来定制。需要一个Notification的接口使用contentView来指定,利用RemoteViews来创建一个View,并将其指定为contentView。
其中的一些方法已过时,需要使用新的方法来替代。