- 浏览: 261318 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (303)
- c (31)
- c++ (16)
- java (18)
- c# (1)
- python (3)
- java web (6)
- oracle (7)
- sqlserver (2)
- mysql (2)
- android (24)
- android系统 (15)
- android多媒体部分 (15)
- android游戏 (12)
- linux (26)
- javaScript (1)
- ajax (1)
- node JS (2)
- html (5)
- apache (3)
- jboss (1)
- weblogic (0)
- 通信协议 (10)
- 云计算 (1)
- 分布式 (5)
- ejb (1)
- webservice (5)
- 设计模式 (16)
- JNI (6)
- swing (13)
- 版本控制 (1)
- UML (1)
- xml (4)
- spring (5)
- hibernate (5)
- struts1 (3)
- struts2 (4)
- ibatis (0)
- tomcat (2)
- 心得体会 (1)
- css (1)
- 嵌入式 (41)
- arm体系结构 (10)
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系统学习笔记一
2012-09-03 15:01 9071.android的系统架构(linux2.6内核) Lin ... -
android系统学习笔记二
2012-09-03 15:03 912android的linux内核和驱动程序 Androidr专 ... -
android系统学习笔记三
2012-09-03 15:05 838第四章android的底层库和程序 知识点: And ... -
android系统学习笔记四
2012-09-03 15:07 1134Android的GUI系统 AndroidGUI系统综 ... -
android系统学习笔记五
2012-09-03 15:12 2200android中的audio系统 Audo系统主要分如下几 ... -
android系统学习笔记六
2012-09-03 15:16 2220android的多媒体系统 ... -
android系统学习笔记七
2012-09-03 15:18 738Android电话部分综述 主 ... -
android系统学习八
2012-09-03 15:19 755Android的联接部分 Wifi部分 Wif ... -
android系统学习笔记九
2012-09-03 15:21 737蓝牙部分 蓝牙协议栈1.11.22.02.13.0 异步数 ... -
android系统学习笔记十一
2012-09-03 15:22 1502Gps(globalPositionSystem全球定位系统) ... -
android系统学习笔记十二
2012-09-03 15:23 1018Android的传感器系统 ... -
Android编译系统详解(一)
2012-09-10 13:45 829+++++++++++++++++++++++++++++ ... -
android----ServiceManager
2012-09-18 00:33 4319serviceManager 在c++层如何使用servi ... -
android系统移植学习笔记一
2012-09-21 16:08 627系统框架 applicationjava应用程序 ...
相关推荐
《Android自定义控件开发入门与实战》这本书深入浅出地讲解了如何在Android平台上创建和使用自定义控件,旨在帮助开发者从基础知识到实战技巧,全方位掌握这一核心技术。 一、自定义控件基础 自定义控件在Android中...
2. **onDraw()**:这是自定义绘图的核心方法。在这里,我们使用Canvas对象进行绘制。首先,使用`canvas.drawColor()`设置背景色,然后使用`canvas.drawCircle()`绘制圆盘。为了绘制方向箭头,我们可以使用`canvas....
以上就是关于“Android自定义adapter的listview”的主要知识点。自定义Adapter是Android开发中的核心技能之一,掌握好这一技巧,能帮助我们实现各种复杂的界面效果。通过不断实践和优化,我们可以在保证性能的同时,...
这个类是自定义键盘的核心,它负责处理键盘的显示、输入事件以及与其他组件的交互。 ```java public class CustomKeyboardService extends InputMethodService { // 实现相关方法 } ``` 2. 设计键盘布局 在res/...
在Android开发中,有时我们可能需要对系统的默认控件进行扩展和自定义,以满足特定的设计需求或功能增强。本文将深入探讨如何自定义`RadioGroup`布局,并通过修改源码来创建一个自定义控件。`RadioGroup`是Android...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特且功能丰富的用户界面。这个“android 自定义view比较综合的例子”显然涵盖了多个高级话题,旨在帮助有一定基础的开发者提升自定义...
这个“Android自定义弹出框实现(修改版)完整实例源码”就是一个很好的示例,它展示了如何根据自己的需求设计和构建个性化的弹出框。下面将详细介绍这个实例中的关键知识点。 首先,我们要理解Android中的弹出框...
3. **绘制视图**:自定义View的核心在于重写`onDraw(Canvas canvas)`方法。在这个方法中,使用Canvas对象进行绘图操作,如画圆、画线、设置颜色等。在罗盘的例子中,我们需要绘制指针、刻度、背景等元素。 4. **...
总结,创建一个Android自定义软键盘需要对Android的输入法框架有深入理解,涉及到`InputMethodService`、`Keyboard`类以及布局设计等多个方面。通过自定义布局和逻辑,我们可以实现独特的键盘样式和交互效果,满足...
本示例“Android自定义键盘之中文键盘demo”旨在教你如何为Android应用创建一个功能完备的中文输入键盘。下面将详细介绍这个过程中的关键知识点。 1. **Android InputMethodService(IMS)**: 自定义键盘的核心是...
综上所述,实现"Android自定义汽车仪表"涉及的核心知识点包括: 1. 自定义视图的创建与绘制 2. `Canvas`和`Paint`对象的使用 3. 动画的实现,如`ValueAnimator`和`ObjectAnimator` 4. 事件处理,如触摸事件 5. Java...
总的来说,这个项目涵盖了Android自定义View的基本流程,以及图形绘制、颜色处理、动态更新等核心知识点,是学习Android自定义组件的一个良好实践。通过学习和研究,开发者不仅可以掌握自定义View的开发技巧,还能...
在Android开发中,自定义Launcher是一项常见的需求,它允许开发者创建独特的用户界面,提供与原生...通过分析和修改`ScrollLayoutGrid_v3`,可以深入了解Android自定义视图的实现,同时也可以提升解决实际问题的能力。
在Android开发中,自定义...总的来说,`CircleLayout`是一个很好的实例,展示了Android自定义布局的实现过程。通过学习和理解这个例子,开发者可以更好地掌握自定义布局的原理,从而在项目中创造出更多独特的界面效果。
而"PackageManager 2.0 android demo"则是这个项目中的一个重要组成部分,它涉及到Android系统的核心服务——PackageManager服务的升级版。 PackageManager服务是Android系统的核心组件之一,主要负责管理设备上的...
总之,针对Android自定义相机黑屏问题,开发者应该注意设备之间的差异,并使用如`getOptimalPreviewSize()`这样的工具函数来确保选择合适的预览尺寸。避免直接硬编码预览和拍照尺寸,以提高应用在不同设备上的兼容性...
"Android-android自定义尺子"项目就是这样一个示例,它展示了如何在Android应用中创建一个自定义的尺子控件。这个控件可以用于教育、设计或者测量相关的应用程序,提供直观的长度或距离指示。 首先,我们要理解...
在Android开发中,自定义View和自定义属性是提升应用个性化和功能扩展性的重要手段。本文将深入探讨这两个核心概念,以及如何在实际项目中应用它们。 ### 自定义View 自定义View允许开发者创建自己的视图组件,以...
本教程将深入探讨如何在Android中实现自定义标题栏,主要基于提供的"android自定义标题栏源码"。 首先,我们了解Android原生标题栏的局限性。原生的ActionBar或Toolbar虽然提供了基础功能,但有时不能满足个性化的...
"android自定义3d画廊效果"是一个专为Android平台设计的特色功能,它通过实现3D视角的图片滚动效果,为用户提供了新颖且引人入胜的交互体验。这个3D Gallery效果的实现基于对Android系统的深入理解和熟练运用,主要...