我是靠谱客的博主 风中咖啡豆,最近开发中收集的这篇文章主要介绍android AIDL服务,2021网易Android高级面试题总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

92.static final int TRANSACTION_getQuote = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);

93.}

94.public double getQuote(java.lang.String ticker) throws android.os.RemoteException;

95.}

对于所生成的类,请注意以下几点。

在 AIDL 文件中定义的接口在生成的代码中实现为接口 (也就是说,有一个名为IStockQuoteService的接口)。

名为Stub的 static final 抽象类扩展了 android.os.Binder并实现了 IStockQuoteService。请注意该类是一个抽象类。

名为 Proxy的内部类实现了 IStockQuoteService, 后者是Stub类的代理。

AIDL文件必须位于应该包含所生成文件的包中(在AIDL文件的包声明中指定)。

在服务类中实现AIDL接口

上边我们为股票报价服务定义了 AIDL 文件并生成了绑定文件。现在我们将提供该服务的实现。要实现服务的接口,需要编写一个类来扩展 android.app.Service 并实现 IStockQuoteService接口。我们将编写的类 命名为 StockQuoteService。为了将服务向客户端公开,StockQuoteService 需要提供onBind()方法 的实现,我们还需要将一些配置信息添加到 AndroidManifest.xml文件中。  下面给出 我们服务类得实现。

IStockQuoteService 服务实现。

package com.androidbook.stockquoteservice;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.os.RemoteException;

import android.util.Log;

public class StockQuoteService extends Service {

private static final String TAG = “StockQuoteService”;

public class StockQuoteServiceImpl extends IStockQuoteService.Stub {

@Override

public double getQuote(String ticker) throws Rem

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

浏览器打开:qq.cn.hn/FTe 免费领取

oteException {

Log.v(TAG, "getQuote() called for " + ticker);

return 20.0;

}

}

@Override

public void onCreate() {

super.onCreate();

Log.v(TAG, “onCreate called”);

}

@Override

public void onDestroy() {

super.onDestroy();

Log.v(TAG, “onDestory() called”);

}

@Override

public void onStart(Intent intent, int startId) {

super.onStart(intent, startId);

Log.v(TAG, “onStart() called”);

}

@Override

public IBinder onBind(Intent intent) {

Log.v(TAG, “onBind() called”);

return new StockQuoteServiceImpl();

}

}

在这个服务类中大家可以看到我们实现了 onBind() 方法。从AIDL文件生成的 Stub类是抽象类并且它实现了 IStockQuoteService接口。在我们的服务实现中,有一个扩展了 Stub类得内部类,名为 StockQuoteServiceImpl。此类充当着远程服务实现,而且 onBind()方法会返回此类的实例。到此,我们有了一个有效的 ADIL服务,但是外部的客户端还无法连接到它。

要将服务向客户端公开,需要在AndroidManifest.xml文件中添加服务声明,而这一次我们需要一个Intent 过滤器来公开服务,如下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i5HMl1Je-1636556589376)(http://dl.iteye.com/upload/attachment/473828/b86f52c6-be7c-3370-9984-11f0b5165e3d.jpg “点击查看原始大小图片”)]

从客户端应用程序调用服务

当客户端与服务通信时,它们之间必须有一个协议或契约。在Android中,这个契约就是AIDL。所以,使用服务的第一步是,获取服务的 AIDL文件并将其复制到客户端项目中。当将AIDL文件复制到客户端项目时,AIDL 编译器将创建一个接口定义文件,这个文件与我们在服务端定义的文件相同。这会向客户端公开所有的方法、参数并返回服务的类型。我们创建一个新项目并复制AIDL文件。

(1)创建一个新的Android项目, 将其命名为 StockQuoteClient。使用不同的包名称比如 com.androidbook.stockquoteclient。在Create Activity字段中使用 MainActivity注意不要把IStockQuoteService.aidl文件放到这包中,这个包只有一个MainActivity 类。

(2)在此项目中新建一个包 com.androidbook.stockquoteservice,放在src目录下。

(3)将IStockQuoteService.aidl文件从 StockQuoteService 项目也就是我们服务端得项目复制到新建的包中。复制过来之后,AIDL编译器会自动生成关联的java文件。

重新生成的服务接口充当着客户端与服务之间的契约。下一步是获取服务的引用,以便调用getQuote()方法。对于远程服务,必须调用 bindService()方法,而不是 startService()方法。

客户端布局文件

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:orientation=“vertical”

android:layout_width=“fill_parent”

android:layout_height=“fill_parent”

<Button

android:id="@+id/bindBtn"

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“Bind”/>

<Button

android:id="@+id/callBtn"

android:layout_height=“wrap_content”

android:layout_width=“wrap_content”

android:text=“Call Again”/>

<Button

android:id="@+id/unbindBtn"

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“UnBind”/>

MainActivity类

package com.androidbook.stockquoteclient;

import com.androidbook.stockquoteservice.IStockQuoteService;

import android.app.Activity;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.os.Bundle;

import android.os.IBinder;

import android.os.RemoteException;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.Toast;

public class MainActivity extends Activity {

protected static final String TAG = “StockQuoteClient”;

private IStockQuoteService stockService = null;

private Button bindBtn;

private Button callBtn;

private Button unbindBtn;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

bindBtn = (Button) findViewById(R.id.bindBtn);

bindBtn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

bindService(new Intent(IStockQuoteService.class.getName()),

serConn, Context.BIND_AUTO_CREATE);

bindBtn.setEnabled(false);

callBtn.setEnabled(true);

unbindBtn.setEnabled(true);

}

});

callBtn = (Button) findViewById(R.id.callBtn);

callBtn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

callService();

}

});

callBtn.setEnabled(false);

unbindBtn = (Button) findViewById(R.id.unbindBtn);

unbindBtn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

unbindService(serConn);

bindBtn.setEnabled(true);

callBtn.setEnabled(false);

unbindBtn.setEnabled(false);

}

});

}

private void callService() {

try {

double val = stockService.getQuote(“SYH”);

Toast.makeText(this, "Value from service is " + val,

Toast.LENGTH_LONG).show();

} catch (RemoteException e) {

Log.e(“MainActivity”, e.getMessage(), e);

}

}

private ServiceConnection serConn = new ServiceConnection() {

// 此方法在系统建立服务连接时调用

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

Log.v(TAG, “onServiceConnected() called”);

stockService = IStockQuoteService.Stub.asInterface(service);

callService();

}

// 此方法在销毁服务连接时调用

@Override

public void onServiceDisconnected(ComponentName name) {

Log.v(TAG, “onServiceDisconnected()”);

stockService = null;

}

};

}

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

Log.v(TAG, “onServiceConnected() called”);

stockService = IStockQuoteService.Stub.asInterface(service);

callService();

}

// 此方法在销毁服务连接时调用

@Override

public void onServiceDisconnected(ComponentName name) {

Log.v(TAG, “onServiceDisconnected()”);

stockService = null;

}

};

}

最后

以上就是风中咖啡豆为你收集整理的android AIDL服务,2021网易Android高级面试题总结的全部内容,希望文章能够帮你解决android AIDL服务,2021网易Android高级面试题总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部