博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Android学习】Android studio 使用AIDL
阅读量:6372 次
发布时间:2019-06-23

本文共 6425 字,大约阅读时间需要 21 分钟。

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/51225755

刚开始接触AIDL,想学着使用它,但是网上搜了一圈发现全都是Eclipise教程,很少有Android studio 的教程,这篇博客将为大家介绍如何使用Android studio来使用aidl,.

一、AIDL创建的步骤

1、创建.aidl文件,可以在里面写自己的方法;

2、编译生成java interface 文件;

3、创建aidl service的服务类,重写前面提到的方法;

4、在Activity中启动Service  调用AIDL;

二、详细步骤

1、创建.adil文件 

如图所示,android studio提供了简便的创建方法:

我们创建一个名为MyService的aidl文件:源代码如下:

interface MyService {    /**     * Demonstrates some basic types that you can use as parameters     * and return values in AIDL.     */    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,            double aDouble, String aString);    void Download();    }

2、编译生成java interface

但是此时并没有AIDL的java文件产生,其实android studio也是带有自动生成的,只不过需要确认一些信息后才能生成。此时,我们可以在目录 build-->generated-->source-->aidl-->test-->debug下面发现还没有任何文件

\

此时,打开AndroidManifest.xml,确认package的值,如如上所示:我的应该是:com.example.terry.studyaidl

如果一致,则编译

编译后我们再看,debug,就会发现多了一个java文件。

3、创建MyService的服务类

package com.example.terry.studyaidl;import android.app.Notification;import android.app.Notification.Builder;import android.app.NotificationManager;import android.app.PendingIntent;import android.app.Service;import android.content.Intent;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;/** * Created by Terry on 2016/4/18. */public class MainService extends Service {    boolean flag;    private final static String TAG = "MainService";int i=1;    @Override    public void onDestroy() {        super.onDestroy();        Log.e(TAG, "+++++=MainSeverice destory++++");        flag = false;    }    @Override    public IBinder onBind(Intent intent) {        Bundle bundle = intent.getExtras();        flag = bundle.getBoolean("flag");        System.out.println(flag);        return ms;    }    @Override    public int onStartCommand(Intent intent,int flags, int startId) {        return super.onStartCommand(intent,flags,startId);    }    @Override    public void onCreate() {        flag = true;        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);        Builder builder = new Notification.Builder(MainService.this);        Intent intent = new Intent(this, MainActivity.class);        PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);        Log.e(TAG, "++++++MainService Create++++++");      builder.setContentIntent(pi)              .setContentText("您有一条新消息!")             .setContentTitle("有通知到来")              .setSmallIcon(R.mipmap.ic_launcher)              .setWhen(System.currentTimeMillis())              .setAutoCancel(true);        Notification notification = builder.getNotification();        notificationManager.notify(i++,notification);    }    MyService.Stub ms = new MyService.Stub() {        @Override        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {        }        @Override        public void Download() throws RemoteException {            Log.d(TAG,"***++++start download+++***");            new Thread(new Runnable() {                int i = 0;                @Override                public void run() {                    //未达到线程条件,会一直在后台运行,就算服务已经关闭                    while (flag) {                        try {                            i++;                            Log.e("i的值是:", String.valueOf(i));                            System.out.println("i的值是" + i);                            Thread.sleep(1000);                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                    Log.e("推出服务i的值是:", String.valueOf(i));                }            }).start();        }    };}

4、在Activity中调用Service

package com.example.terry.studyaidl;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.IBinder;import android.os.RemoteException;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity { private MyService myService;    private Intent binderIntent;    private final static boolean create_flag =true;    private final static boolean destory_flag = false;    private String TAG = "MainActivity";private Button button;    private ServiceConnection sc = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            myService =MyService.Stub.asInterface(service);            try{            //通过AIDL调用Service                Log.d(TAG,"++++start download+++");                myService.Download();                Log.d(TAG, "++++start%%% download+++");            }catch (RemoteException e)            {                e.printStackTrace();            }        }        @Override        public void onServiceDisconnected(ComponentName name) {        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        Log.d(TAG, "+++++++MainActivity start++++");        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //开启服务        Log.e(TAG, "%%%%%%%%%%%");        button = (Button) findViewById(R.id.start);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //Intent i = new Intent(MainActivity.this, MainService.class);                //startService(i);                Log.e(TAG, "%%%%#####%%%%%%%");                //链接远程Service和Activity                binderIntent = new Intent(MainActivity.this, MainService.class);                Bundle bundle = new Bundle();                bundle.putBoolean("flag", create_flag);                binderIntent.putExtras(bundle);                bindService(binderIntent, sc, BIND_AUTO_CREATE);                Log.e(TAG, "%%%%#####%%%%%@@@@@%%");            }        });    }    @Override    protected void onDestroy(){        super.onDestroy();        Log.d(TAG,"+++Activity   onDestory()+++++");        boolean flag = false;        //暂停服务        //Intent intent = new Intent(this,MainService.class);        ///stopService(intent);        //断开连接        unbindService(sc);    }}
对了不要忘记在AndroidMainifest.xml文件中注册Service

你可能感兴趣的文章
Django使用网上模板做个能展示的博客
查看>>
基于同IP不同端口,同端口不同Ip的虚拟主机 基于FQDN的虚拟主机
查看>>
项目软件集成三方模块,编译中int32和uint32定义冲突解决方法
查看>>
StretchDIBits速度测试(HALFTONE)
查看>>
在.NET Workflo“.NET研究”w 3.5中使用多线程提高工作流性能
查看>>
验证Oracle处理速度
查看>>
自己写一个jquery
查看>>
艾伟:C#中抽象类和接口的区别
查看>>
Flink - NetworkEnvironment
查看>>
BZOJ4374 : Little Elephant and Boxes
查看>>
【.Net Framework 体积大?】不安装.net framework 也能运行!?开篇叙述-1
查看>>
LLDP协议、STP协议 笔记
查看>>
如何使用 GroupBy 计数-Count()
查看>>
jquery之clone()方法详解
查看>>
Delphi 用文件流读取文本文件字符串的方法
查看>>
php中怎么导入自己写的类
查看>>
C# 委托
查看>>
Using Information Fragments to Answer the Questions Developers Ask
查看>>
JVM学习(4)——全面总结Java的GC算法和回收机制---转载自http://www.cnblogs.com/kubixuesheng/p/5208647.html...
查看>>
getParameter和getAttribute的区别
查看>>