android service 整理

项目经常要跟别的项目进行交互,比如说蓝牙打印机等,或者处理一些网络状态,或者调用baidu、高德等地图的时候就会用到,

或打开了音乐播放之后,便想去看看图片,或者下载文件的时候,我们看看博客。

Service有两种类型:

  1. 本地服务(Local Service):用于应用程序内部
  2. 远程服务(Remote Sercie):用于android系统的应用程序之间 RPC 这种方式跟Windows RPC一样

以下是Service处理的执行事件及流程图:

 

1) 本地服务只是处理一些业务,不跟Activity进行交互,这种情况我们只需要使用startService及stopService即可。

在使用的之前调用如下代码:

Intent i = new Intent("abc.cdf.xxxx");
Bundle bundle = new Bundle();
bundle.putInt("aa", 11);
i.putExtras(bundle);
startService(i);

方法说明:startService(Intent intent)

 

在退出或者结束的时候,调用stopService即可

stopService(i);

方法说明:stopService(Intent intent)

 

2) 本地服务需要与Activity进行交互,那么我们就要使用bindService及unbindService

Intent i = new Intent("abc.bdf.xxxx");
bindService(i, connection, Context.BIND_AUTO_CREATE);
unbindService(connection);

 

方法说明:

boolean bindService(Intent service, ServiceConnection conn, int flags)
void unbindService(ServiceConnection conn)

3) 远程服务(remote),不在一个应用中,也是使用bindService及unbindService

接口描述语言(AIDL)来定义远程服务的接口, 新建aidl文件,系统会自动生成aidl对应的.java文件

 

事例下载地址1,转自 http://yangguangfu.iteye.com/blog/699306

事件下载地址2

事件中几点说明:

图示1:

<service android:name=".receiverservice.BindMusicPlayerService" >
            <intent-filter>
                <action android:name="com.yang.bindMusic22" />
            </intent-filter>
        </service>

11.其中android:name这个是指的类,系统会根据默认的包,找到对应的java文件,

android:name=".receiverservice.BindMusicPlayerService这个系统找到com.yang.main.receiverservice.BindMusicPlayerService。

如果你写成android:name="receiverservice.BindMusicPlayerService"那么系统会到com.yang.mainreceiverservice.BindMusicPlayerService找文件,

然后系统就会直接Crashed

12. <action android:name="com.yang.bindMusic22" />

这里的action的name是你自已指定的名称,这个一般会用上你的包,保持唯一即可,假如这里是com.yang.bindMusic22那么

你在代码中调用service的时候,也要跟这个一样即可,

 

这里再引用二文,说的也挺详细:

http://www.cnblogs.com/yejiurui/p/3429451.html

http://blog.csdn.net/xiaanming/article/details/9750689

http://blog.csdn.net/ryantang03/article/details/8683921 广播的方式

在Service中处理业务,并且将结果发送广播,然后在Activity的注册广播接收器,接收到广播之后更新UI

这种方式只要注册接收器的都可以接收到广播信息。

以下是对http://blog.csdn.net/ryantang03/article/details/8683921事例的解析:

1)静态

 

// 静态注册
        this.findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //在Servie中处理,3s后弹出对话框
                Intent serviceIntent = new Intent("com.ryan.service");
                startService(serviceIntent);
            }
        });

 

startService开启了一个Service,对应的action是com.ryan.service,我们按下图找到对应的Service

是com.ryan.testserviceandbroadcastreceiver.MainService.java

开启一个Service要执行onCreate,onStartCommond

@Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                try {
                    //To do something...
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                handler.sendEmptyMessage(0);
            }
        }).start();
    }

    Handler handler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            
            //Send broadcast
            Intent boradcastIntent = new Intent(MainBroadcastReceiver.RECEIVER);
            sendBroadcast(boradcastIntent);
        }
        
    };

onStart里面又执行了handlerMessage,sendBroadcast发送广播类型MainBroadcastReceiver.RECEIVER==>

 

我们通过配制文件找到:

指定了接收者是MainBroadcastReceiver

这样系统就会给发广播,调用相应的onReceive方法

其实广播的方式也是简单的,观察者模式而已。

2)动态  系统代码注册,不在配制中

这里发了一个广播,只要是注册了MY_ACTION的都会收到。

这里加了一个注册接收者的代码:

指定了有receiver来接收。

 

posted @ 2016-02-16 14:37  jiduoduo  阅读(252)  评论(0编辑  收藏  举报