博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Studio实现Service AIDL
阅读量:6767 次
发布时间:2019-06-26

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

Android Studio实现Service AIDL

[日期:2015-01-02] 来源:Linux社区  作者:teenyboy [字体:大 中 小]
 
 
 

今天要开发过程中要用到AIDL的调用,之前用的eclipse有大量教程,用起来很方便,现在刚换了 studio,不可否认studio真的很强大,只是很多功能还需要摸索。

AIDL(Android Interface Definition Language)是Android接口定义语言的意思,它可以用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能。

言归正传,今天的主题是远程Service建立AIDL进行通信,通过一个小demo来展示AIDL在Android studio中的实现:

1. 搭建了一个简单的Service框架,仅包括startService(intent),框架在后面代码中展示出来

2. 然后建立AIDL,通过点击建立AIDL文件,如图

建立好之后,出现AIDL文件如图

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

此时,打开AndroidManifest.xml,确认package的值,如我这个

                                           

关键性的一步,确认aidl文件所在的包名和AndroidMainifest.xml的package名是否一致。如果一致,点击 Build-->Make Project,生成相应的java文件。如果不一致,则改aidl的包名,改成一致,再点击生成,生成效果如图。

则此时就可以在程序中通过AIDL调用远程Service的方法,实现AIDL与远程Service进行通信,代码展示如下。

MainActivity.java

public class MainActivity extends ActionBarActivity {

    private MyServiceAIDL myServiceAIDL;

    private Intent binderIntent;
    private final static boolean create_flag=true;
    private final static boolean destory_flag=false;
    private final static String TAG="MainActivity";

    private ServiceConnection sc = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myServiceAIDL = MyServiceAIDL.Stub.asInterface(service);
            try {
                //通过AIDL远程调用
                Log.d(TAG,"++start download++");
                myServiceAIDL.DownLoad();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override

        public void onServiceDisconnected(ComponentName name) {

        }

    };

    @Override

    protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG,"++MainActivity onCreate++");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //开启服务

        Intent intent = new Intent(this, MainService.class);
        startService(intent);

        //连接远程Service和Activity

        binderIntent = new Intent(this,MainService.class);
        Bundle bundle = new Bundle();
        bundle.putBoolean("flag",create_flag);
        binderIntent.putExtras(bundle);
        bindService(binderIntent, sc, BIND_AUTO_CREATE);

    }

    @Override

    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"++MainActivity onDestroy++");

        boolean flag = false;

        //暂停服务
        Intent intent = new Intent(this, MainService.class);
        stopService(intent);

        //断开与远程Service的连接

        unbindService(sc);
    }
}

MainService.java

public class MainService extends Service {

    boolean flag;

    private final static String TAG = "MainService";

    @Override

    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "++MainService onDestroy++");
        flag = false;
    }

    @Override

    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override

    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "++MainService onCreate++");

        Notification no = new Notification(R.drawable.ic_launcher, "有通知到来", System.currentTimeMillis());

        Intent intent = new Intent(this, MainActivity.class);
        PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
        no.setLatestEventInfo(this, "AIDLDemo", "running", pi);
        startForeground(1, no);
    }

    @Override

    public IBinder onBind(Intent intent) {

        Bundle bundle = intent.getExtras();

        flag = bundle.getBoolean("flag");
        System.out.println(flag);
        return ms;
    }

    MyServiceAIDL.Stub ms = new MyServiceAIDL.Stub() {

        @Override
        public void DownLoad() throws RemoteException {

            new Thread(new Runnable() {

                int i = 0;

                @Override

                public void run() {
                    //未达到线程条件,会一直在后台运行,就算服务已经关闭
                    while (flag) {

                        try {

                            i++;
                            System.out.println("i的值是" + i);
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("退出服务");
                }
            }).start();

        }

    };
}

AndroidManifest.xml

<application

        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service

            android:name=".MainService"
            android:process=":remote"></service>
    </application>

MyServiceAIDL.aidl

// myServiceAIDL.aidl

package com.example.wanghao.aidldemo;

// Declare any non-default types here with import statements

interface MyServiceAIDL {

    void DownLoad();

}

 12.04(64位)安装Android Studio 全过程  

Android Studio v0.1尝鲜  

Android Studio使用教程  

Android Studio开发指南  

Android Studio设置主题 和 不支持中文的问题解决方法  

Android Studio 下载安装以及不能打开的解决���法  

Android Studio安装使用图文教程  

本文永久更新链接地址

 
 
 

  • 1

转载于:https://www.cnblogs.com/pengmn/p/5594362.html

你可能感兴趣的文章
C++ 采集音频流(PCM裸流)实现录音功能
查看>>
Oracle Instant Client(即时客户端) 安装与配置
查看>>
windows环境下 生成git公钥和私钥
查看>>
ONVIF测试方法及工具
查看>>
JQuery实战---窗口效果
查看>>
最好用的Android黑客应用程序和工具
查看>>
矩阵的乘法算法
查看>>
跨服务器查询
查看>>
Android之SpannableString、SpannableStringBuilder总结
查看>>
自定义注解
查看>>
陌陌前端面试 - 凉面
查看>>
How to set up Conflux
查看>>
大数据时代,你的个人信息安全吗?
查看>>
我的友情链接
查看>>
javascript时间格式化
查看>>
Spring MVC基础
查看>>
JavaScript权威指南笔记
查看>>
android启动activity文本框不获得焦点
查看>>
linux运维实战练习-2015年8月30日课程作业(练习)安排
查看>>
给新手的最佳类Windows界面的Linux发行版
查看>>