日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式案例Show
[導(dǎo)讀]在上一篇中,我們已經(jīng)完成了Framework層的JNI開(kāi)發(fā),本篇我們?cè)趂ramework層實(shí)現(xiàn)一個(gè)LedTestService的服務(wù),并在service中調(diào)用Jni的函數(shù)接口。 Android內(nèi)有許多系統(tǒng)管理服務(wù),如 窗口管理服務(wù)WindowManagerService 電源管理服務(wù)PowerManagerService 通知管理服

ich_media_content " id="js_content">
center;align-items: center;" data-mid="" mpa-from-tpl="t">


在上一篇中,我們已經(jīng)完成了Framework層的JNI開(kāi)發(fā),本篇我們?cè)趂ramework層實(shí)現(xiàn)一個(gè)LedTestService的服務(wù),并在service中調(diào)用Jni的函數(shù)接口。


Android內(nèi)有許多系統(tǒng)管理服務(wù),如

  • 窗口管理服務(wù)WindowManagerService

  • 電源管理服務(wù)PowerManagerService

  • 通知管理服務(wù)NotifacationManagerService

  • 電池管理服務(wù)BatteryManagerService等等

這些Manager提供了很多對(duì)系統(tǒng)層的控制接口。并且他們是由SystemServer在開(kāi)機(jī)后啟動(dòng)并管理的。自定義的服務(wù)加入后,也類似這些系統(tǒng)服務(wù),開(kāi)機(jī)會(huì)自動(dòng)啟動(dòng),并且也有同樣的上層的訪問(wèn)接口。

添加一個(gè)自定義的系統(tǒng)服務(wù),需要按照service的框架要求實(shí)現(xiàn)以下幾步:


1、TestLedService服務(wù)






路徑:frameworks/base/services/core/java/com/android/server/TestLedService.java

package com.android.server;import android.content.Context;import android.util.Slog;import android.app.ITestLedService;import android.content.BroadcastReceiver;import android.app.ActivityManager;import android.content.ComponentName;import android.content.Intent;import android.content.IntentFilter;import android.os.SystemProperties;import android.content.pm.PackageManager;import java.io.BufferedReader;import java.io.IOException;import java.io.DataOutputStream;import java.io.DataInputStream;import java.io.InputStreamReader;import java.text.SimpleDateFormat;import java.util.Date;

public class TestLedService extends ITestLedService.Stub {private final Context mContext;private boolean mFlag;private boolean mled2On = false;private int mFlashDelay = 1000;

public TestLedService(Context context) {super();mContext = context;
testledinit_native();

mFlag = true;if(mFlag){new Thread(new led2Flash()).start();}}

public void SetLed1(int on){setled1_native(on);}

public void SetLed2(int delay){mFlashDelay = delay;if(!mFlag && mFlashDelay != 0){new Thread(new led2Flash()).start();}if(delay == 0){mFlag = false;}}

class led2Flash implements Runnable {public void run(){while(true){Slog.i("TestLed_service", "led2 flash");if(mled2On){setled2_native(0);mled2On = false;}else{setled2_native(1);mled2On = true;}try{Thread.sleep(mFlashDelay);}catch(Exception e){e.printStackTrace();}if(!mFlag){break;}}}}private static native boolean testledinit_native();private static native void setled1_native(int val);private static native void setled2_native(int val);}

TestLedService實(shí)現(xiàn)了兩個(gè)led的控制的函數(shù),SetLed1設(shè)置led1開(kāi)與關(guān),setLed2設(shè)置led2的閃爍頻率。分別調(diào)用了JNI的函數(shù)setled1_native和setled2_native。



2、TestLedManager.java






路徑:frameworks/base/core/java/android/app/TestLedManager.java


package android.app;

import android.app.ITestLedService;import android.util.Slog;import android.os.RemoteException;

public class TestLedManager {

private final ITestLedService mService;

public TestLedManager(ITestLedService mService) {this.mService = mService;}

public void SetLed1(int on){try {mService.SetLed1(on);} catch (RemoteException ex) {ex.printStackTrace();}}

public void SetLed2(int delay){try {mService.SetLed2(delay);} catch (RemoteException ex) {ex.printStackTrace();}}}

Manager是APP和service通訊的橋梁,通過(guò)系統(tǒng)接口getSystemService,app獲取到該service的Manager。而在TestLedManager中就是將service內(nèi)實(shí)現(xiàn)的函數(shù)接口重新封裝了一下。



3、ITestLedService.aidl






路徑:frameworks/base/core/java/android/app/ITestLedService.aidl

package android.app;


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

interface ITestLedService {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/void SetLed1(int on);void SetLed2(int delay);}

TestLedService和TestLedManager在不同的進(jìn)程,所以要考慮到進(jìn)程通訊的問(wèn)題。Manager通過(guò)增加一個(gè)aidl文件來(lái)描述通訊接口。



4、aidl加入編譯mk






路徑:frameworks/base/Android.mk

LOCAL_SRC_FILES += \……core/java/android/service/quicksettings/IQSTileService.aidl \core/java/android/app/ITestLedService.aidl \



5、Context.java新增服務(wù)名






路徑:frameworks/base/core/java/android/content/Context.java

public static final String TestLed_SERVICE="TestLed";



6、注冊(cè)服務(wù)






路徑:frameworks/base/core/java/android/app/SystemServiceRegistry.java

import android.app.TestLedManager;import android.app.ITestLedService;

final class SystemServiceRegistry {……static {……registerService(Context.TestLed_SERVICE, TestLedManager.class,new CachedServiceFetcher<TestLedManager>() {@Overridepublic TestLedManager createService(ContextImpl ctx) {IBinder b = ServiceManager.getService(Context.TestLed_SERVICE);ITestLedService service = ITestLedService.Stub.asInterface(b);return new TestLedManager(service);}});



7、啟動(dòng)服務(wù)






路徑:frameworks/base/services/java/com/android/server/SystemServer.java


private void startOtherServices() {……TestLedService TestLed = new TestLedService(context);
ServiceManager.addService(Context.TestLed_SERVICE, TestLed);


8、seliunx相關(guān)






路徑:system/sepolicy/service.te

添加

type TestLed_service, system_api_service, system_server_service, service_manager_type;


路徑:system/sepolicy/service_contexts

添加

TestLed                                  u:object_r:TestLed_service:s0


編譯過(guò)程中會(huì)報(bào)錯(cuò),You have tried to change the API from what has been previously approved.是因?yàn)樾略隽讼到y(tǒng)api函數(shù),make update -api 后再次編譯即可。

燒錄進(jìn)設(shè)備并啟動(dòng)后,adb shell service list | grep TestLed *,就可看到新增的service已經(jīng)在運(yùn)行了,就說(shuō)明成功了。

掃碼關(guān)注我們

看更多嵌入式案例

center;font-size: 15px;box-sizing: border-box;" powered-by="xiumi.us" mpa-from-tpl="t">



喜歡本篇內(nèi)容請(qǐng)給我們點(diǎn)個(gè)再看

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀

在這篇文章中,小編將對(duì)電源管理ic的相關(guān)內(nèi)容和情況加以介紹以幫助大家增進(jìn)對(duì)它的了解程度,和小編一起來(lái)閱讀以下內(nèi)容吧。

關(guān)鍵字: 電源 ic 電源管理ic

本文中,小編將對(duì)中國(guó)ic設(shè)計(jì)公司予以介紹,如果你想對(duì)它的詳細(xì)情況有所認(rèn)識(shí),或者想要增進(jìn)對(duì)它的了解程度,不妨請(qǐng)看以下內(nèi)容哦。

關(guān)鍵字: ic CPU 芯片

在這篇文章中,小編將為大家?guī)?lái)中國(guó)ic設(shè)計(jì)公司的相關(guān)報(bào)道。如果你對(duì)本文即將要講解的內(nèi)容存在一定興趣,不妨繼續(xù)往下閱讀哦。

關(guān)鍵字: ic 芯片

印度海得拉巴和馬薩諸塞州波士頓2022年4月20日 /美通社/ -- 全球領(lǐng)先的生命科學(xué)組織數(shù)據(jù)和分析提供商Excelra宣布,對(duì)價(jià)值和證據(jù)領(lǐng)域快速發(fā)展的年輕技術(shù)公...

關(guān)鍵字: ce

北京2022年4月11日 /美通社/ -- 亞馬遜云科技助力數(shù)據(jù)服務(wù)和管理平臺(tái)提供商Kyligence構(gòu)建企業(yè)級(jí)云原生大數(shù)據(jù)OLAP解決方案,使其云上交付速度提升30%。同時(shí),通過(guò)加入“ISV(獨(dú)立軟件供應(yīng)商)加速贏計(jì)劃...

關(guān)鍵字: ce ge 進(jìn)程

(全球TMT2022年4月11日訊)亞馬遜云科技助力數(shù)據(jù)服務(wù)和管理平臺(tái)提供商Kyligence構(gòu)建企業(yè)級(jí)云原生大數(shù)據(jù)OLAP解決方案,使其云上交付速度提升30%。同時(shí),通過(guò)加入“ISV(獨(dú)立軟件供應(yīng)商)加速贏計(jì)劃”,K...

關(guān)鍵字: 亞馬遜 ge ce

(全球TMT2022年4月7日訊)為Microsoft Dynamics 365和Salesforce提供云端配置、價(jià)格、報(bào)價(jià)(CPQ)和文檔自動(dòng)化軟件的供應(yīng)商Experlogix宣布與Microsoft Dynami...

關(guān)鍵字: ce Dynamics logix

(全球TMT2022年3月28日訊)Super Micro Computer, Inc. (SMCI) 宣布將支持NVIDIA最新的軟件和硬件版本。Supermicro的NVIDIA認(rèn)證服務(wù)器和工作站經(jīng)過(guò)驗(yàn)證...

關(guān)鍵字: ni ic Enterprise

面向供電行業(yè)的革命性交鑰匙解決方案,可提高系統(tǒng)可靠性和電網(wǎng)彈性 伊利諾伊州博林布魯克2022年3...

關(guān)鍵字: 輸電線路 ic

2021年全年多項(xiàng)業(yè)績(jī)指標(biāo)再創(chuàng)新高; “企業(yè)數(shù)字化運(yùn)營(yíng)解決方案”全年收入持續(xù)三位數(shù)同比增長(zhǎng); “SaaS+X”商業(yè)模式為“企業(yè)數(shù)字化運(yùn)營(yíng)解決方案”的迅猛增長(zhǎng)...

關(guān)鍵字: ic ck
關(guān)閉