`

android 自定义核心服务

 
阅读更多
native service

zygote 服务


kernel->init(init.rc)->demons
zygote->dalvik VM->systemServer
runtime->serviceManager






zygote包括两部分:
c/c++层,用来产生进程给核心服务和app
java层,调用c/c++层






activityManager 活动管理器
管理activity属性和行为,管理service
示例代码:取得正在执行的
// 取得正在运行的进程
ActivityManager activityManager = (ActivityManager)


this.getSystemService(ACTIVITY_SERVICE);
// 指定最大进程数
List<RunningServiceInfo> infos =


activityManager.getRunningServices(30);
for (int i = 0; i < infos.size(); i++) {
Log.i("tag", "info" + infos.get(i).process);
}


packageManager管理应用包
// 取得已安装包
List<PackageInfo> infos = getPackageManager


().getInstalledPackages(0);
for(int i=0;i<infos.size();i++){
Log.i("tag", "package info: "+infos.get


(i).packageName);
}






windowManager视窗管理器
// WindowManager manager=(WindowManager)
// this.getSystemService(WINDOW_SERVICE);
// 取得屏幕大小
Display display = getWindowManager().getDefaultDisplay();
display.getWidth();
display.getHeight();


// 移除某个view
getWindowManager().removeViewImmediate(new View(this));
=================================================================




native Service开发要点:

c++代码:


头文件:
#include <stdint.h>
#include <sys/type.h>
#include <utils/Parcel.h>
#ifndef ANDROID_MISOO_SQRSERVICE_H
#define ANDROID_MISOO_SQRSERVICE_H
#include <utls.h>
#include <utils/Keyed/Vector.h>
#include <ui/SurfaceComposerClient.h>
namespace_android{
class SQRService:public BBinder
{
public:
static int instantiate();
virtual status_t onTransact(uint32_t,const


Parcel&,Parcel*,uint32_t);
SQRService();
virtual ~SQRService();
};
};
#endif


源文件 :
#include <utils/IServiceManager.h>
#include <utils/IPCThreadState.h>
#include <utils/RefBase.h>
#include <utils/IInterface.h>
#include <utils/Parcel.h>
#include "SQRService.h"


namespace android{
enum{
SQUARE=IBinder::FIRST_CALL_TRANSACTION,
};
int SQRService::instantiate(){
LOGE("SQRService instantiate");
int r = defaultServiceManager()->addService(
String16("misoo.sqr"), new SQRService());
LOGE("SQRService r = %d\n", r);
return r;
}
SQRService::SQRService(){
LOGV("SQRService created");
}
SQRService::~SQRService(){
LOGV("SQRService destroyed");
}
status_t SQRService::onTransact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)


{
switch(code) {
case SQUARE: {
int num = data.readInt32();
reply->writeInt32(num * num);
LOGE("onTransact::CREATE_NUM.. n=%d\n", num);
return NO_ERROR;
}
break;
default:
LOGE("onTransact::default\n");
return BBinder::onTransact(code, data, reply, flags);
}}
};




makefile文件:
LOCAL_PATH:=${call my-dir}
Include ${CLEAR_VARS}
LOCALL_SRC_FILES:=\SQRService.cpp #源文件(相对于当前的目录)
#LOCAL_MODULE:=test_exe # 最终生成可执行文件的名称
LOCAL_MODULE:=libSQRS01 #模块最终的名称
LOCAL_C_INCLUDES:=$(JNI_H_INCLUDE) #需要包含的头文件路径
#LOCAL_STATIC_LIBRARIES:= #需要连接的静态库(*.a)
LOCLA_SHARED_LIBRARIES:=\libutils #需要连接的动态库(*.so)
LOCAL_PERLINK_MODULE:=false
Include ${BUILD_SHARED_LIBRARY} # 以一个静态库的方式进行编译




添加服务:
#include <sys/types.h>
#include <unistd.h>
#include <grp.h>
#include <utils/IPCThreadState.h>
#include <utils/ProcessState.h>
#include <utils/IServiceManager.h>
#include <utils/Log.h>
#include <private/android_filesystem_config.h>
#include "../libadd/SQRService.h"
//#include <libadd/SQRService.h>
using namespace android;
int main(int argc, char** argv){
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
LOGI("ServiceManager: %p", sm.get());
SQRService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}


然后将静态库文件放到模拟器的/system/lib
addService放到模拟器的/system/bin


===========================================================
提供通用API:IBinder接口



// sqr.h
#ifndef ANDROID_MISOO_SQR_H
#define ANDROID_MISOO_SQR_H


namespace android {
class SQR {
private:
const void getSQRService();
public:
SQR();
int execute(int n);
};
}; //namespace
#endif // ANDROID_MISOO_SQR_H









// sqr.cpp
#include <utils/IServiceManager.h>
#include <utils/IPCThreadState.h>
#include "SQR.h"


namespace android {
sp<IBinder> m_ib;
SQR::SQR(){
getSQRService();
}
const void SQR::getSQRService(){
sp<IServiceManager> sm = defaultServiceManager();
m_ib = sm->getService(String16("misoo.sqr"));
LOGE("SQR:getSQRService %p\n",sm.get());
if (m_ib == 0)
LOGW("SQRService not published, waiting...");
return;
}
int SQR::execute(int n) {
Parcel data, reply;


data.writeInt32(n);
LOGE("SQR::execute\n");
m_ib->transact(0, data, &reply);
int num = reply.readInt32();
return num;
}
};


============================================================


/* com_misoo_service_sqr01.h */
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_misoo_service_sqr01 */


#ifndef _Included_com_misoo_service_sqr01
#define _Included_com_misoo_service_sqr01
#ifdef __cplusplus


extern "C" {


#endif
/*
* Class: com_misoo_service_sqr01
* Method: addTest
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_misoo_service_sqr01_execute
(JNIEnv*, jobject, jint);


#ifdef __cplusplus
}
#endif
#endif








/* com_misoo_service_sqr01.cpp */
#include "com_misoo_service_sqr01.h"
#include <utils/Log.h>
#include <utils/IPCThreadState.h>
#include <utils/ProcessState.h>
#include "../core_service/SQRService.h"
#include "SQR.h"


using namespace android;
JNIEXPORT jint JNICALL Java_com_misoo_service_sqr01_execute(JNIEnv


*env,
jobject thiz, jint x)
{
char s[] = "Java_com_misoo_service_sqr01_execute!!!";
LOGE("%s X = %d\n", s, x);
SQR* sqrObj = new SQR();


int num = sqrObj->execute(x);
return num;
}


// Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
com_misoo_service_sqr01.cpp \
SQR.cpp


base := $(LOCAL_PATH)/../../..
LOCAL_C_INCLUDES := \
$(JNI_H_INCLUDE) \
$(base)/CS01
LOCAL_SHARED_LIBRARIES := \
libutils \
libSQRS01
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libSQRS01_jni
include $(BUILD_SHARED_LIBRARY)


========================================


// sqr01.java
package com.misoo.service;
public class sqr01
{
static
{ System.loadLibrary("libSQRS01_jni"); }
public static native int execute(int x);
}




// SuperSQR.java
package com.misoo.service;
abstract public class SuperSQR {
public int exec(){
return sqr01.execute(onGetX());
}
abstract public int onGetX();
}




// mySQR.java
package com.misoo.pk01;
import com.misoo.service.SuperSQR;
public class mySQR extends SuperSQR {
@Override
public int onGetX() {
return 60;
}
}




// ac01.java
package com.misoo.pk01;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;


public class ac01 extends Activity implements OnClickListener {
private Button btn, btn2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
btn = new Button(this); btn.setBackgroundResource


(R.drawable.heart);
btn.setId(101); btn.setText("run");
btn.setOnClickListener(this);
LinearLayout.LayoutParams param =
new LinearLayout.LayoutParams(120, 55);
param.topMargin = 10;
layout.addView(btn, param);


btn2 = new Button(this); btn2.setBackgroundResource


(R.drawable.ok);
btn2.setId(102); btn2.setText("exit");
btn2.setOnClickListener(this);
layout.addView(btn2, param);
setContentView(layout);
}
public void onClick(View v) {
switch(v.getId()){
case 101:
mySQR sqr = new mySQR();
int k = sqr.exec();
setTitle("Value = " + String.valueOf(k));
break;
case 102:
finish();
break;
}
}}
分享到:
评论

相关推荐

    Android实现使用自定义ContentProvider共享生词本数据库

    Android高级编程雪梨作业之自定义ContentProvider 将任务01生词本作业中生成的生词本数据库通过自定义ContentProvider的方式,共享给其他应用。 要求如下: (1) 使用自定义SQLiteOpenHelper来管理数据库; (2) 提交...

    android开发入门与实战(下)

    3.3.1 开发的基石——AndroidAPI核心开发包介绍 3.3.2 拓展开发外延——Android可选API介绍 3.4 本章小结 第4章 赚钱的市场——AndroidMarket及应用发布 4.1 GoogleMarket产生背景与目的 4.2 体验“选货”的乐趣...

    Android 自定义View实现单击和双击事件的方法

    自定义View, 1. 自定义一个Runnable线程TouchEventCountThread ,...核心代码如下:  public class MyView extends View { ...... // 统计500ms内的点击次数 TouchEventCountThread mInTouchEventCount = new Touch

    Android自定义文件路径选择器

    是通过继承BaseAdapter 完成的,里面有自定义layout界面。进行管理返回跟目录以及上一层,方便管理。 package com.filebrowser; import android.content.Context; import android.graphics.Bitmap; import android....

    Android 自定义LayoutManager实现花式表格

    本文的项目也是学习自定义LayoutManager绝佳资料,大家有需要的可以好好拜读。 前言 表格是自打我进公司以后就使用的控件,起初使用的是ScrollablePanel,从一开始的被花式吊打,到后期的熟练使用。 大佬写的控件...

    AndroidKeyboard:具有子类型,主题和表情的Android自定义键盘

    Android自定义键盘 带有子类型,主题和表情的Android自定义键盘。 对于正在寻找带有主题的自定义键盘的人们,键盘是一个完整的解决方案。 该应用程序包含Pashto(阿富汗),Dari / Farsi(阿富汗)和英文键盘(字母...

    一个项目玩转 Android 自定义 Drawable。.zip

    资源包中的文件手册部分,详细记录了Android开发的核心知识点和常用技术。无论是初学者还是有一定经验的开发者,都能从中找到所需的学习资料。手册采用了简洁明了的排版方式,使得查阅更加方便快捷。同时,手册内容...

    用户自定义拍照功能

    用户自定义拍照功能具体代码 ,拍照的核心类是 android.hardware.Camera

    Android自定义view绘制圆环占比动画

    二、核心代码 1.自定义MyProgressView.java package com.czhappy.effectdemo.view; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android....

    Android-Hexagon:Android自定义六边形控件

    一:自定义六边形效果图 apk 下载地址 二.核心算法 平面内一个坐标点是否在多边形内判断,使用射线法判断。从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。 如果是奇数个交点,则说明点在多边形内部...

    androidCustomViewComponents:Android自定义视图组件

    Android自定义视图 畅谈自定义视图无需Android。 Meetup Android库里蒂巴 Evento 2020年29日, sendotransmitidoatravés做的。 没有任何。 保留权利 O projeto foi dividido emtrêsmódulos,sendo doismódulos...

    Android编程实现自定义toast示例

    主要介绍了Android编程实现自定义toast,结合简单实例形式分析了自定义布局toast核心实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    Android自定义控件实现饼状图

    核心代码在onDraw函数里边,对静态控件进行绘制即可 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); /** * 饼状图的x坐标 */ float centreX= getWidth()/5; /** * 饼状图的y坐标 ...

    Android自定义圆形倒计时进度条

    本文实例为大家分享了Android倒计时进度条展示的具体代码,供大家参考,具体内容如下 效果预览 源代码传送门:https://github.com/yanzhenjie/CircleTextProgressbar 实现与原理 这个文字圆形的进度条我们在很多APP...

    毕设项目——基于原生Android的仿Keep键身打卡App(源码)

    键身打卡App,基于原生Android、Java实现。页面简洁实用,功能齐全,代码注释多。 核心功能:登录注册、个人信息维护、系统设置、搜索、日历键身打卡、健身图文视频教程、收藏评论点赞购买教程、社区分享等。 适用...

    Android自定义processor实现bindView功能的实例

    在现阶段的Android开发中,注解越来越流行起来,比如ButterKnife,Retrofit,Dragger,EventBus等等都选择使用注解来配置。按照处理时期,注解又分为两种类型,一种是运行时注解,另一种是编译时注解,运行时注解...

Global site tag (gtag.js) - Google Analytics