赵工的个人空间


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


 手持终端

首页 > 专业技术 > 手持终端 > 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。
其中的一些方法已过时,需要使用新的方法来替代。


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