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; 
       } 
  }}

转载于:https://www.cnblogs.com/retacn-yue/archive/2012/09/18/2761240.html

android 自定义核心服务相关推荐

  1. Android自定义ViewGroup基本步骤

    1.自定义属性,获取自定义属性,可参考 ​ Android自定义View基本步骤 ​ 2.onMeasure() 方法,for循环测量子View,根据子View的宽高来计算自己的宽 高 3.onDra ...

  2. Android自定义View —— TypedArray

    在上一篇中Android 自定义View Canvas -- Bitmap写到了TypedArray 这个属性 下面也简单的说一下TypedArray的使用 TypedArray 的作用: 用于从该结 ...

  3. Android 自定义View —— Canvas

    上一篇在android 自定义view Paint 里面 说了几种常见的Point 属性 绘制图形的时候下面总有一个canvas ,Canvas 是是画布 上面可以绘制点,线,正方形,圆,等等,需要和 ...

  4. android 自定义loading,Android自定义动画-StarLoadingView

    今天来分享第二个自定义loading的动画,起了个名字叫 蹦跶的星星 ,还是老规矩先介绍,后上图. 实现效果在最后,GIF有点大,手机流量慎重. 介绍 首先声明做这个动画的初衷是为了学习和分享,所以从 ...

  5. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

  6. android 自定义命名空间,Android自定义ActionBar实例

    本文实例讲述了android自定义actionbar的实现方法.分享给大家供大家参考.具体实现方法如下: android 3.0及以上已经有了actionbar的api,可以通过引入support p ...

  7. Android自定义View:ViewGroup(三)

    自定义ViewGroup本质是什么? 自定义ViewGroup本质上就干一件事--layout. layout 我们知道ViewGroup是一个组合View,它与普通的基本View(只要不是ViewG ...

  8. Android自定义视图四:定制onMeasure强制显示为方形

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

  9. android自定义滑块解锁,android 滑动解锁

    通过android自定义View实现横向的滑动解锁,1.滑动到中间会自动返回到原始的位置,2.滑动到底部会自动解锁,会触发解锁的回调:首先看效果图如下: 实现以上部分一共分为三部分: 其中背景通过sh ...

最新文章

  1. mysql防止索引崩溃_MySQL优化之避免索引失效的方法
  2. Oracle簇表介绍 (clustered table)
  3. 记录 之 Argparse 中的 可选参数 action 用法
  4. 数据结构(Data structures)(二):结构体指针
  5. 阿里云 服务器 系统 php mysql_阿里云服务器配环境(Ubuntu 16.04+Nginx+MySQL+PHP)并部署hexo博客...
  6. javaScript js 可滑动的div块
  7. ROS入门笔记(三):二进制包与源代码包
  8. signature=b21ede5d7e667b061a2058d2d4aba643,【D2D8524B18023CCDD6DBEEF2AB467
  9. XSS-Game level 5
  10. VMware:未能将管道连接到虚拟机, 所有的管道范例都在使用中
  11. 预训练模型MT-BERT的探索和应用
  12. C#--图表控件(Chart)
  13. LOL云顶弈记牌易语言源码
  14. EVO Evaluation of SLAM 5 --- ORB-SLAM3 精度和性能效果评估
  15. IPFS技术系列之IPFS底层基础
  16. c语言中怎么用scanf给二维数组赋值,关于VC++6.0无法用scanf()输入浮点值赋给二维数组的问题...
  17. 谁你的财神 谁是你的穷神
  18. 求n的阶乘的算法框图_递归算法是一种直接或者间接调用自身函数或者方法的算法...
  19. 【关于单片机的N多问题】关于单片机的N多问题
  20. java 发送邮件和读取邮件(163邮箱为例)

热门文章

  1. 近期要推出的ISA2006系列文章
  2. 【转】JS回调函数--简单易懂有实例
  3. 通过PRINT过程制作报表
  4. 8.6 GOF设计模式四: 策略模式… Strategy Pattern
  5. 2018.2.11-12 写作业
  6. JavaScript中的执行环境
  7. HDU 2084 数塔 DP
  8. SQLBulkCopy 性能统计
  9. TCP服务器和客户端的链接例子(侧重点在注意关闭套接子,减少套接子的描述子)
  10. RichEdit使用大全