android学习笔记五

Android的另外两大组件:BroadcastReceiver和Service。

一、BroadcastReceiver广播接收者,广播是Android中传递事件的方式,有两个方面:广播发送者和广播接收者。

1、广播发送者可以发送两种广播:同步广播有序广播,两者的区别是

  ①接收顺序的区别:同步广播同步接收,有序广播可以通过指定优先级来设置接收顺序

  ②是否可以中断的区别:由于有序广播有顺序,才有可能将广播进行中断,不让后来者进行接收;而同步广播则不能中断。

2、广播接收者:广播发送的具体内容就是一个隐式意图对象(因为通常是给另外的应用使用的),接收者通过两步来实现

  ①在清单文件中进行配置,

  ②继承BroadcastReceiver对象,并重写onReceive方法,在其中实现功能即可。

有序广播通过指定优先级来确定接收顺序,优先级从-1000~1000,

  ①如果同一个应用中的优先级相同,则在清单文件中前面的先接收

  ②如果不同应用中的优先级相同,则先安装的应用先接收

参考:http://blog.csdn.net/xiazdong/article/details/7768807

二、Service,服务是没有界面而在后台长期运行的程序。

1、在Android中按返回键退出一个应用并不会(内存充足时)直接销毁一个进程,所以其中的子线程也可以在后台运行,这种线程和服务的区别是优先级不同,如果内存不足,被销毁的顺序不同。而且即使服务所在进程被销毁,如果内存充足会自动重新运行。有关Android进程内容参考:http://mobile.51cto.com/aprogram-459724.htm

作为Android四大组件之一,Service只要继承Service类,并在清单文件中配置即可使用。

2、有两种方式开启Service,①使用startService();②使用bindService()。两者的区别在于

  ①前者创建一个服务之后,就与这个服务没有关联了,因为没有方法可以在获取这个服务的实例了。但是进行联系还需要复杂的操作,并且还要区分进程内绑定本地服务和进程外绑定远程服务

  ②通过绑定开启的service,一旦调用这个服务的activity被销毁则这个服务也被销毁。即服务不能长期存在。

 1 import android.app.Activity;
 2 import android.content.ComponentName;
 3 import android.content.Intent;
 4 import android.content.ServiceConnection;
 5 import android.os.Bundle;
 6 import android.os.IBinder;
 7 import android.view.View;
 8
 9 public class MainActivity extends Activity {
10     private MyConn conn ;
11     private IMiddlePerson mp;
12
13     @Override
14     protected void onCreate(Bundle savedInstanceState) {
15         super.onCreate(savedInstanceState);
16         setContentView(R.layout.activity_main);
17     }
18
19     @Override
20     protected void onDestroy() {
21         System.out.println("啊啊啊,我是activity,我挂了");
22         super.onDestroy();
23     }
24
25     //绑定服务
26     public void bind(View view){
27         //3.activity采用绑定的方式去开启服务。
28             //激活一个服务的意图
29         Intent intent = new Intent(this,MyService.class);
30             //保持联系的连接对象
31         conn = new MyConn();
32         bindService(intent, conn, BIND_AUTO_CREATE);
33
34     }
35     //解除绑定服务
36     public void unbind(View view){
37         unbindService(conn);
38     }
39
40     private class MyConn implements ServiceConnection{
41         //4. 当服务被连接的时候调用,服务被成功绑定的时候调用。IBinder就是绑定的Service的onBind()的返回值,
42         //!!!这就是联系所在
43         @Override
44         public void onServiceConnected(ComponentName name, IBinder service) {
45             System.out.println("在activity里面成功得到了中间人");
46             mp = (IMiddlePerson) service;
47         }
48         //当服务失去连接的时候调用(一般进程挂了,服务被异常杀死)
49         @Override
50         public void onServiceDisconnected(ComponentName name) {
51
52         }
53     }
54
55     //调用服务里面的方法。
56     public void call(View view){
57         //5.通过中间人调用服务里面的方法。
58         mp.callMethodInService(55);
59     }
60 }

调用方

 1 import android.app.Service;
 2 import android.content.Intent;
 3 import android.os.Binder;
 4 import android.os.IBinder;
 5 import android.widget.Toast;
 6
 7 public class MyService extends Service {
 8
 9     //2.实现服务成功绑定的代码 ,返回一个中间人(一个符合IBinder要求的类,这里就是下面的内部类)。
10     @Override
11     public IBinder onBind(Intent arg0) {
12         System.out.println("服务被成功绑定了。。。。");
13         return new MiddlePerson();
14     }
15
16     @Override
17     public boolean onUnbind(Intent intent) {
18         System.out.println("onunbind");
19         return super.onUnbind(intent);
20     }
21
22     @Override
23     public void onCreate() {
24         System.out.println("oncreate");
25         super.onCreate();
26     }
27
28     @Override
29     public int onStartCommand(Intent intent, int flags, int startId) {
30         System.out.println("onstartcommand");
31         return super.onStartCommand(intent, flags, startId);
32     }
33
34     @Override
35     public void onDestroy() {
36         System.out.println("ondestory");
37         super.onDestroy();
38     }
39
40     /**
41      * 这是服务里面的一个方法
42      */
43     public void methodInService(){
44         Toast.makeText(this, "哈哈,服务给你办好了暂住证。", 0).show();
45     }
46
47     //1.第一步服务要暴露方法 必须要有一个中间人
48     private class MiddlePerson extends Binder implements IMiddlePerson{
49         /**
50          * 代办暂住证
51          * @param money 给钱 50块钱以上才给办。
52          */
53         public void callMethodInService(int money){
54             if(money>=50){
55                 methodInService();
56             }else{
57                 Toast.makeText(getApplicationContext(), "多准备点钱。", 0).show();
58             }
59         }
60         /**
61          * 陪领导打麻将
62          */
63         public void playMajiang(){
64             System.out.println("陪领导打麻将。");
65         }
66     }
67 }

service方

注意:上面的service方的中间人内部类是私有的,所以向外传递时不能直接将其抛出,所以在这里使用了一个接口作为中转,将需要暴露的方法通过接口暴露。

参考:http://blog.csdn.net/ryantang03/article/details/7770939

3、除了可以绑定(这里强调绑定是指有数据共享的情况,如果仅仅是激活一个服务则不需要)自己写的服务(同一个进程中),还可以绑定系统/他人写的service。这就涉及到进程间通讯,在Android中的使用的是Binder方式实现的,而且提供了一个AIDL的轻量级实现方法。使用过程和上面类似,区别有2点:

  ①service方:对外暴露方法使用AIDL(Android接口定义语言)而不是java中的接口,区别是没有修饰符,eclipse可以自动生成一个可用于进程间通讯的接口类(在/gen目录下)

  ②调用方:在调用方的应用中也需要以同样的方式创建AIDL文件,然后通过 类名.Stub.asInterface(service) 来获取中间对象。

4、混合调用服务:即同时使用绑定和start方式调用服务。这是为了解决两种方式的缺点(start方式不能通信,绑定方式不能长期存在)

三、Intent:可以理解为一种请求或意愿,可以用来激活Activity,Service和Broadcast Receiver,相应组件只要在配置中添加intent-filter即可获取指定意图。

意图分两种:显示意图,隐式意图。区别在于前者通过构造函数的参数指定了具体的接收者,使用意图过滤器过滤的就是隐式意图,显示意图通常用于激活自己的组件,而隐式意图通常用于激活他人的/系统的组件。

一个Intent可以设置动作(Action),数据(Data-->uri),类型(Type-->MIME),分类(Category),附加信息(Extras),而通过过滤器匹配意图就是需要进行三个匹配,一个是action,一个是category,一个是data,可以是全部或部分匹配。

参考:http://blog.csdn.net/think_soft/article/details/7330095,

http://blog.csdn.net/t12x3456/article/details/7688154

http://fenglingdangyang.blog.sohu.com/231856618.html

时间: 2024-07-31 22:06:12

android学习笔记五的相关文章

Android学习笔记五之Service

Android学习笔记五之Service 1.什么是Service? 什么是Service?Service是Android系统的四大组件之一,官方文档是这样描述Service的: A Service is an application component that can perform long-running operations in the background and does not provide a user interface. Another application comp

android学习笔记五。2、其他组件

一.ContentProvider内容提供者.是是android中一个应用向第三方共享数据的方式,android中的联系人,sms(短信记录)等都是通过这一方式来向外提供的 1.使用: 在应用中使用ContentProvider提供的数据并不是直接使用的,而是需要通过ContentResolver来实现的,ContentResolver中包含query/insert/delete/update等方法用于操作数据,但其内部就是调用ContentProvider的实现类来真正操作的. 使用Conte

Android学习笔记(十五)——碎片的生命周期(附源码)

碎片的生命周期 点击下载源码 与活动类似,碎片具有自己的生命周期.理解了碎片的生命周期后,我们可以在碎片被销毁时正确地保存其实例,在碎片被重建时将其还原到前一个状态. 1.使用上一篇的项目Fragments,在Fragment1.java文件中添加如下代码: package net.zenail.Fragments; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragm

十五、Android学习笔记_授权过程

1.需要申请App Key和App Secret.不同的开发平台有不同的接入方式,可以参考文档,然后将这两个值放进去. 2.通过OAuth类实现认证,它会自动跳转到认证界面,进行授权,成功之后需要处理回调接口. 3.在第二步调用回调接口时,它会返回用户的基本信息,比如用户id.此时需要将用户id信息保存起来,为后面登录做准备.回调接口的写法就为myapp://AuthorizeActivity,其中scheme全部为小写字母. <activity android:name="com.wei

Android学习笔记二十五之ListView多布局实现

Android学习笔记二十五之ListView多布局实现 这一节是介绍ListView这个控件的最后一节,实现一个Item的多布局.像我们经常在用的各种即时通讯工具,QQ.微信等,假设他们的会话界面是ListView实现的,那么ListView就有多种Item布局,这一节,我们就来实现一个ListView的多种Item. 要实现ListView里面有多种Item,就要重写适配器的两个方法getViewTypeCount()和getItemViewType(int position),第一个方法是

【转】Pro Android学习笔记(五):了解Content Provider(上)

Content Provider是抽象数据封装和数据访问机制,例如SQLite是Android设备带有的数据源,可以封装到一个content provider中.要通过content provider进行读写,需要使用URI.推荐阅读Android学习笔记(四七):Content Provider初谈和Android联系人信息.Android学习笔记(四八):提供自己的Content Provider和Android学习笔记(四九):通过Content Provider访问数据.Content

【转】 Pro Android学习笔记(五二):ActionBar(5):list模式

可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和theme有关,如果theme设置不正确,还可能会出现异常. 相关的代码如下: public class ListActionBarDemo extends SearchTestCase3 implements OnNavigationListener{ //List触发的回调函数接口    @Ov

【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager

目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csdn.net/flowingflying/ 应用有时需要从web中下载一个大文件,并保存在本地,这个操作过程是标准的,因此在Android2.3引入了DownloadManager类.相关的学习也可以参考Android学习笔记(四六):互联网通信-文件下载. 小例子 先看一个小例子,如下图所示.lay

【转】Pro Android学习笔记(二五):用户界面和控制(13):LinearLayout和TableLayout

目录(?)[-] 布局Layout 线性布局LinearLayout 表格布局TableLayout 布局Layout Layout是容器,用于对所包含的view进行布局.layout是view的子类,所以可以作为view嵌入到其他的layout中.Android的layout有LinearLayout.TableLayout,RelativeLayout.FrameLayout.GridLayout. 线性布局:LinearLayout 这是最常用的,有anroid:orientation来确