Android studio实现Service AIDL

转载 2016年08月30日 20:43:20

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

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

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

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

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

\

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

\

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

\

则此时就可以在程序中通过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();
}

参考文章:http://blog.csdn.net/guolin_blog/article/details/9797169

Android Studio中创建AIDL Service

用startService,bindService创建的服务只能在本应用程序内访问,如果要使得本程序的服务能够被其他应用程序访问,这时候就要使用远程过程调用(Remote Procedure Call...
  • shenzhonglaoxu
  • shenzhonglaoxu
  • 2015年01月15日 12:49
  • 13627

AIDL使用详解 (二)AndroidStudio中 创建 AIDL service

当我对AIDL一无所知的时候,想去了解一下,网上一搜,虽然有很多资料,博客是写这个的,但是,一无所知的我看不懂呀。各种关于Android studio 使用 AIDL的,但是讲解不是很细致,总是版图而...
  • Zheng548
  • Zheng548
  • 2017年01月18日 22:53
  • 1183

Android-在Android studio中实现远程服务(Service)AIDL

在Android studio 实现远程服务(Service)AIDL的方法与在eclipse中实现有些不同,Android studio中自带了AIDL创建的方式,而eclipse中需要手动创建; ...
  • u014657752
  • u014657752
  • 2015年08月27日 16:17
  • 1553

Android Studio下使用AIDL创建和使用远程service

好久没来更新博客了,今天心血来潮来写一篇关于如何在AS下结合AIDL创建和使用远程service。在此之前我先跟大家解释下什么是远程service?以及为什么要使用远程service?相信不管对于安卓...
  • u010214991
  • u010214991
  • 2016年07月05日 18:34
  • 1600

Android studio 下的aidl编程实现Android的夸进程间通信

前言 Android中夸进程间通信方式有很多种方式,比如:aidl,Messenger,文件共享,广播(BroadCast),ContentProvider,Socket(网络通信)。每种方式都有自...
  • feidu804677682
  • feidu804677682
  • 2016年05月09日 18:46
  • 5401

Android用AIDL创建Service

Android AIDL Service 实践
  • hujinglovekmg
  • hujinglovekmg
  • 2016年06月16日 15:28
  • 1247

android studio使用Aidl跨进程调用服务

以前就知道其大概代码流程,但是一直没有敲代码去实现,今天将其实现了,android studio下编写也遇到了一些小细节的问题,特此记录一下。 既然是模拟Aidl通讯,那么当然要编写两个应用了,一个...
  • lishaobo211985
  • lishaobo211985
  • 2016年10月20日 22:02
  • 1244

Android AIDL Service调试方法

问题假设现在有A和B两个进程,其中A注册了一个Service,B调用了该Service。而你即使在service当中打了断点,无论对A还是对B进行Debug都还是无法停在断点处。如何解决这个问题?解决...
  • ymjiang820
  • ymjiang820
  • 2016年02月26日 14:56
  • 1194

AndroidStudio通过AIDL开启、绑定远程Service

本文以一个简单的案例,记录一下怎么使用AIDL结合Serice实现进程间的通信,让其他程序可以调用服务中的方法...
  • man_help
  • man_help
  • 2016年04月17日 15:25
  • 3523

Android Service讲解 和 aidl 实现

Android Service讲解 和 aidl 实现代码下载 Android Service讲解 和 aidl 实现一、Android Service1.建立一个serviceservice和act...
  • u012915455
  • u012915455
  • 2016年11月10日 16:46
  • 1397
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android studio实现Service AIDL
举报原因:
原因补充:

(最多只允许输入30个字)