Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

Android Aidl 爱之初体验?

$
0
0

从前有个山 山里有个庙 庙里有个和尚 。。。。。一年过去了。老和尚跟小和尚说,孩子时候下去见母老虎了,山下的女人是老虎,师傅有一个要求您要学会aidl,当时小和尚一听懵逼了,what is this?这时老和尚摸着小和尚的头说:”学会aidl你就能下山了,遇到母老虎就可以跟我通信,师傅就马上下山救您了“,
遇见了不要慌,就这样小和尚很不开心,因为马上要离开师傅了,不开心,宝宝不开心嘛,但是师傅掏出一本宝典 焕名”“aidl之远程助攻母老虎72式”,小和尚拿着这本宝典开开心心的下山了,就这样十年过去了,小和尚并没有看到很多母老虎,他这时又想起师傅的话,默默的流泪,我是不是找了个假师傅,好尴尬呢?好了下面直接练习宝典!开大招!

Soeasy!

首先看第一招:入门式

这里写图片描述

第二招:惑骗式

先给大佬们上个图

这里写图片描述

第三招 :进攻式

  1. 首先在src目录下创建一个aidl目录
  2. 创建一个IRemoteService.aidl文件
  3. 支持的数据类型 aidl支持的参数类型有int long boolean float double String

    第四招:招虎式
    这里创建一个方法进行通信
    String baseAidl();

第五招:训母式

1、这里需要创建一个RemoteService类
2、然后绑定服务类

3、创建一个Stub抽象类
4、在清单文件AndroidMainfest.xml中注册 需要注意5.0以上系统需要设置包名 acton Name等

全部代码如下

package com.example.arial.dgamedetail.service;

import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.support.v4.os.IResultReceiver;
import android.util.Log;

import com.example.arial.dgamedetail.IRemoteService;

/**
 * Created by John on 2017/3/7.
 */

public class RemoteService extends Service {
    private static final String TAG = "RemoteService";


    public static abstract class Stub extends IRemoteService.Stub {

    }

    private IRemoteService.Stub mIRemoteService = new IRemoteService.Stub() {
        @Override
        public String baseAidl() throws RemoteException {
            return "您好,我是Kadan";
        }

        @Override
        public IBinder asBinder() {
            return super.asBinder();
        }

        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }
    };

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Intent intent1 = new Intent(this, RemoteService.class);
        bindService(intent1, new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                IResultReceiver.Stub.asInterface(service);
                Log.e(TAG, "onServiceConnected: ");
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        }, BIND_AUTO_CREATE);

        return mIRemoteService.asBinder();
    }

    @Override
    public boolean bindService(Intent service, ServiceConnection conn, int flags) {
        return super.bindService(service, conn, flags);
    }
}

绑定服务

 @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Intent intent1 = new Intent(this, RemoteService.class);
        bindService(intent1, new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                IResultReceiver.Stub.asInterface(service);
                Log.e(TAG, "onServiceConnected: ");
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        }, BIND_AUTO_CREATE);

        return mIRemoteService.asBinder();
    }
@Override
    public boolean bindService(Intent service, ServiceConnection conn, int flags) {
        return super.bindService(service, conn, flags);
    }

清单文件中注册

  <service android:name=".service.RemoteService" android:process=":remote">
            <intent-filter >
                <action android:name="com.example.arial.dgamedetail.service.RemoteService"/>
            </intent-filter>
        </service>

第六招 :放虎式

写完之后别忘记主Activity中调用需要在onResume再次绑定服务

 @Override
    protected void onResume() {
        super.onResume();
        Intent intent=new Intent();
        intent.setAction(Constant.ACTION);
        //5.0以上系统需要设置 
        intent.setPackage(Constant.PACKAGE);
        //绑定服务
        bindService(intent, new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
              mIRemoteService=IRemoteService.Stub.asInterface(service);
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        },BIND_AUTO_CREATE);//自动创建
    }

另外给按钮设置一个监听事件我这里使用的是xml中添加onClick方法Aidl


    /**
     * 设置发送消息的监听事件
     * @param v
     */
    public void Aidl(View v)
    {
        //判断当前服务是否为空
        try {
            if(mIRemoteService!=null){
                String text=mIRemoteService.baseAidl();
                if(text!=null)
                {
                    tv_aidl.setText(text);
                }
            }else{
                tv_aidl.setText("不好意思没有获取到消息");
            }
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

初始化TextView这里不再赘述看宝典吧

  /**
     * 初始化UI组件
     */
    private void initView() {
        tv_aidl= (TextView) findViewById(R.id.tv_aidl);
    }

最后贴上AidlActivity完整代码

package com.example.arial.dgamedetail;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

import com.example.arial.dgamedetail.constant.Constant;

/**
 * Created by John on 2017/3/7.
 */

public class AidlActivity extends AppCompatActivity {
    //远程服务类
    private IRemoteService mIRemoteService;
    //显示的内容
    private TextView tv_aidl;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_aidl);
        initView();
    }

    /**
     * 初始化UI组件
     */
    private void initView() {
        tv_aidl= (TextView) findViewById(R.id.tv_aidl);
    }

    /**
     * 设置发送消息的监听事件
     * @param v
     */
    public void Aidl(View v)
    {
        //判断当前服务是否为空
        try {
            if(mIRemoteService!=null){
                String text=mIRemoteService.baseAidl();
                if(text!=null)
                {
                    tv_aidl.setText(text);
                }
            }else{
                tv_aidl.setText("不好意思没有获取到消息");
            }
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        Intent intent=new Intent();
        intent.setAction(Constant.ACTION);
        //5.0以上系统需要设置
        intent.setPackage(Constant.PACKAGE);
        //绑定服务
        bindService(intent, new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
              mIRemoteService=IRemoteService.Stub.asInterface(service);
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        },BIND_AUTO_CREATE);//自动创建
    }
}

最后看下Constant封装

package com.example.arial.dgamedetail.constant;

/**
 * Created by John on 2017/3/7.
 */

public class Constant {
    //包名
    public static final String PACKAGE="com.example.arial.dgamedetail";
    //清单文件注册的action
    public static final String ACTION="com.example.arial.dgamedetail.service.RemoteService";
}

到这里基本技术了我只是个初级的就是aidl基本使用 然后进行简单的远程通信
可能以后还需要跟服务端进行通信等等,其实android与银行对接用的就是这种机制,如果大家感兴趣可以自己去网上了解学习哈!后期继续更新其他招式!转载请注明出处!http://blog.csdn.net/qq_15950325/article/details/60756495有些话乱编的,大家不要在意!对于一个理科生而言,编个故事真难!生活不容易!切吹切珍惜!每个人有每个人的特点!主要是能学到东西就ok!欢迎各位大佬批评指导!谢谢!另外感兴趣欢迎各位新老司机来开车!疯狂Android进阶之旅

作者:qq_15950325 发表于2017/3/7 11:09:49 原文链接
阅读:389 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>