自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(179)
  • 资源 (2)
  • 收藏
  • 关注

原创 【并发编程】Binder运行机制的流程图

Binder工作在Linux层面,属于一个驱动,只是这个驱动不需要硬件,或者说其操作的硬件是基于一小段内存。从线程的角度来讲,Binder驱动代码运行在内核态,客户端程序调用Binder是通过系统调用完成的。参考资料http://blog.csdn.net/manoel/article/details/39556219

2014-10-16 13:35:50 2845

原创 【移动开发】AIDL中callback的实现

AIDL实现就可以在客户端中调用服务端的方法,并传递数据到服务端,也可以服务端传递数据过来;但是如果要从服务端去调用客户端的方法,那么就需要注册callback! 抄自和源码:http://zxl-ong.iteye.com/blog/736888 前面的文件讲到用AIDL来实现进程间的通信,但是只讲到客户端调用服务端的方法,现在来看看服务端对客户端方法的调用callback!服务端对客户端的调用

2014-10-16 11:45:21 7515

原创 【并发编程】AIDL关键字

onewayOneway interfacesIn early betas, the Android IPC was strictly synchronous. This means that service invocations had to wait for the return value of the remote method to arrive back to the caller. This is generally an advantage because the caller ca

2014-10-16 11:44:01 6066

原创 【问题汇总】ScrollView嵌套GridView的问题

前些日子在开发中用到了需要ScrollView嵌套GridView的情况,由于这两款控件都自带滚动条,当它们碰到一起的时候便会出问题,即GridView会显示不全。 解决办法,自定义一个GridView控件。[java] view plaincopypublic class MyGridView extends GridView {         public MyGridView(Contex

2014-10-15 23:04:24 2130

原创 【问题汇总】列表数组越界的问题

遇见了一个诡异的问题,ListView发生数组越界(偶尔会),程序崩溃。错误信息如下: W/dalvikvm( 5176): threadid=1: thread exiting with uncaught exception (group=0x40015568) E/zhe800_android( 5176): Invalid index 2, size is 0 E/zhe800_android( 5176): java.lang.IndexOutOfBoundsE

2014-10-15 23:02:20 7463 1

原创 【移动开发】ViewPager缓存机制

1.    实现ViewPager的页面懒加载;在某些情况下,例如使用ViewPager查看多张大图,此时多张图片不能一次性载入,只有在浏览该页面时才载入(或者预先载入下一页面)页面的具体内容。2.    可控ViewPager缓存页面的数量。常见的情况:1.页面的总数是已知的,或者可以计算出来,每个页面占用的资源并不多并且需要经常使用这些页面。这是可以考虑将其常驻ViewPager而不去销毁(频

2014-10-15 23:00:47 25297 2

原创 【问题汇总】ScrollView嵌套ListView的问题

因产品的需求,需要在ScrollView中嵌套ListView来达到效果。众所周知,ScrollVIew和ListView都是可滑动的容器,嵌套使用一定会出现一些问题。[html] view plaincopy在CODE上查看代码片派生到我的代码片 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"

2014-10-15 22:59:15 7447

原创 【移动开发】startForeground()让服务保持前台级别

最近在使用android 4.1系统的时候,发现在手机休眠一段时间后(1-2小时),后台运行的服务被强行kill掉,有可能是系统回收内存的一种机制,要想避免这种情况可以通过startForeground让服务前台运行,当stopservice的时候通过stopForeground去掉。以下是android官方描述:Running a Service in the ForegroundA foreg

2014-10-15 17:00:37 12107 1

原创 【移动开发】Context类bindService()参数

bindService()的函数原型,代码如下:

2014-10-15 13:59:43 15839 3

原创 【移动开发】Service类onStartCommand()返回值和参数

Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理。然后我们注意到这个函数有一个int的返回值,这篇文章就是简单地讲讲int返回值的作用。从Android官方文档中,我们知道onStartCommand有4种返回值:ST

2014-10-15 13:32:10 13092 1

原创 【移动开发】SparseArray替代HashMap

SparseArray是android里为这样的Hashmap而专门写的class,目的是提高效率,其核心是折半查找函数(binarySearch)[java] view plaincopyprivate static int binarySearch(int[] a, int start, int len, int key) {      int high = start + len, low 

2014-10-14 17:06:01 1680

原创 【移动开发】一张图搞定Activity和Fragment的生命周期

2014-10-14 16:55:12 1801

原创 【移动开发】plurals

不同的语言对数量的语法规定有不同的规则。在英语里面,例如,1是特例。我们会直接写1book,而针对一个以上的我们会在book后加复数形式。这种区别对单数和复数来说是很普遍的,但是其他的语言做了更好的区分。对Android来说,它支持zero,one,two,few,many,和other。     对一个给定的语言和数字来说,决定使用哪一个case的规则是很复杂的,所以android提供了方法ge

2014-10-13 16:32:22 1715

原创 【移动开发】targetSdkVersion的作用

在AndroidMenifest.xml中,常常会有下面的语句:         在project.properties中,会看到下面的语句: target=android-10 如果是使用Eclipse的话,还可能会看到这样的警告:Attribute minSdkVersion (4) is lower than the project target API level (10)        

2014-10-13 16:02:16 11283

原创 【移动开发】Handler的sendMessageAtTime()和sendEmptyMessageDelay()区别

函数原型public boolean sendMessageAtTime (Message msg, long uptimeMillis)Message  //待发送消息uptimeMillis   //sendMessageAtTime,即在确定的时间发送这个消息,这个时间通过这个参数指定这个时间由uptimeMillis传递 这两句是等效的,都是延时1秒将消息加入列队msgHandle.sen

2014-10-12 13:21:56 9384 2

原创 【并发编程】线程优先级

事实证明,线程的优先级是影响线程的调度的主要因素。其他因素包括占用CPU的执行时间长短,线程分组调度等等。另外,有两种方法可以设置线程的优先级。android.os.ProcessProcess.setThreadPriority(int priority); // Calling thread.Process.setThreadPriority(int threadId, int priority); // Thread with specific id.通过这种方式设置的优先级,又称“

2014-10-11 14:46:37 2108

原创 【并发编程】线程和进程的关系

一、进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。二、线程是进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程; 进程和线程的关系:(1)一个线程只能属于一个进程,而一个进程可以有

2014-10-11 12:01:06 2013 1

原创 【并发编程】通过命令行获取线程信息

常用命令adb shell ps-t查看进程中线程的信息-x查看utime和stime-P查看属性-p查看调度策略,通常是查看一个app处于前台还是后台-c查看哪一个CPU在执行这个进程name|pid用名字或pid过滤例子1. 查看包名为com.eat的线程,也就是com.eat应用的UI线程。adb shell ps -t |grep com.eatUSER PID PPID VSIZE RSS WCHAN

2014-10-11 11:58:12 8718 2

原创 【并发编程】实现多线程的两种方法

java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程。Thread类是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方

2014-10-10 17:52:09 2528

原创 【并发编程】生产者与消费者模式

生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。在同一个进程地址空间内执行的两个线程生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。Java实现简单的生产者-消费者模式例子。import

2014-10-10 17:40:49 2308

原创 【环境配置】配置vmware

1. 升级Linux内核导致VMware无法使用的问题1) 获取root权限,进入相关目录sucd /usr/lib/vmware/modules/source2) 解压vmnet源码包(得到vmnet-only文件夹)tar -xf vmnet.tar3.备份原来的文件mv vmnet.tar vmnet.tar.bak4. 修改源文件filter.c修改206行的:VNetFilterHook

2014-10-09 15:09:03 1904

原创 【内核研究】处理者_Handler

尽管MessageQueue提供了直接读/写的函数接口,但对于程序员来说,一般不直接读/写消息队列。之前了解到,在Looper.loop()函数中,当取出消息后,会回调msg.target对象的handleMessage()函数,而msg.target的类型正是Handler。 /** * Run the message queue in this thread. Be sure to call * {@link #quit()} to end the loop.

2014-10-09 14:37:24 1495 1

原创 【内核研究】消息队列_MessageQueue

消息队列采用排队方式对消息进行处理,即先到的消息会先得到处理,但如果消息本身指定了被处理的时刻,则必须等到该时刻才能处理该消息。消息在MessageQueue中使用Message类表示,队列中的消息以链表的结构进行保存,Message对象内部包含一个next变量,该变量指向下一个消息对象。MessageQueue中的两个主要函数是“取出消息”和“添加消息”,分别是next()和enquenceMessage()。next()函数final Message next() { int

2014-10-09 14:14:28 2257

原创 【内核研究】循环接收者_Looper

Looper的作用有两点: 为调用静态方法prepare()的线程创建一个消息队列MessageQueue。 提供静态方法loop(),使调用该方法的线程进入无限循环,并从消息队列中读取消息。如何创建消息队列Looper的静态方法prepare()中,会给线程局部存储添加一个新的Looper对象,而Looper的构造函数中,会创建一个MessageQueue消息队列,代码如下: /** Initialize the current thread as a looper.

2014-10-09 11:58:12 1217

原创 【内核研究】线程局部存储_TheadLocal

通过调用Looper的静态方法prepare()为线程创建MessageQueue对象,代码如下: private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } sThre

2014-10-08 18:32:35 1335

原创 【内核研究】理解Manager

ServiceManager所管理的所有Service都是以相应的Manager返回给客户端,因此,这里简述一下Framework中关于Manager的语义。在我们中国的企业里,Manager一般指经理,比如项目经理、人事经理、部门经理。经理本身的含义比较模糊,其角色有些是给我们分配任务,比如项目经理;有些是给我们提供某种服务,比如人事经理;有些则是监督我们的工作等。而在Android中,Mana

2014-09-30 11:26:22 1282

原创 【内核研究】ServiceManager管理的服务

系统服务中的Binder对象在应用程序编程时,经常使用getSystemService(String serviceName)方法获取一个系统服务,那么,这些系统服务的Binder引用是如何传递给客户端的呢?须知系统服务并不是通过startService()启动的。getSystemService()函数的实现是在ContextImpl类中,该函数所返回的Service比较多,具体可参照源码。这些

2014-09-30 11:03:22 1843

原创 【内核研究】保证包裹内参数顺序aidl工具的使用(下)

这些代码主要完成以下三个任务。定义一个Java interface,内部包含aidl文件所声明的服务函数,类名称为IMusicPlayerService,并且该类基于IInterface接口,即需要提供一个asBinder()函数。定义一个Proxy类,该类将作为客户端程序访问服务端的代理。所谓的代理主要就是为了前面所提到的第二个重要问题--统一包裹内写入参数的顺序。定义一个Stub类,这是一个a

2014-09-28 18:44:46 1367

原创 【内核研究】保证包裹内参数顺序aidl工具的使用(上)

关于第二个问题,Android的SDK中提供了一个aidl工具,该工具可以把一个aidl文件转换为一个Java类文件,在该Java类文件,同时重载了transact和onTransact()方法,统一了存入包裹和读取包裹参数,从而使设计者可以把注意力放到服务代码本身上。aidl工具不是必需的,对于有经验的程序员来讲,手工编写一个参数统一的包裹存入和包裹读出代码并不是一件复杂的事情。接下来看aidl

2014-09-28 18:32:14 1549

原创 【内核研究】获取Binder对象

事实上,对于有创造力的程序员来讲,可以完全不使用Service类,而仅仅基于Binder类编写服务程序,但只是一部分。具体来讲,可以仅使用Binder类扩展系统服务,而对于客户端服务则必须基于Service类来编写。所谓的系统服务是指可以使用getSystemService()方法获取的服务,所谓的客户端服务是指应用程序提供的自定义服务。关于Service的内部机制请参考第14章,本章仅指出Ser

2014-09-28 17:55:53 1949

原创 【内核研究】Binder客户端设计

要想使用服务端,首先要获取服务端在Binder驱动中对应的mRemote变量的引用,获取的方法后面小节将有介绍。获得该变量的引用后,就可以调用该变量的transact()方法。该方法的函数原型如下:其中data表示的是要传递给远程Binder服务的包裹(Parcel),远程服务函数所需要的参数必须放入这个包裹中。包裹中只能放入特定类型的变量,这些类型包括常用的原子类型,比如String、int

2014-09-26 16:58:03 1155

原创 【内核研究】Binder服务端设计

设计Service端很简单,从代码的角度来讲,只要基于Binder类新建一个Servier类即可。以下以设计一个MusicPlayerService类为例。假设该Service仅提供两个方法:start(String filePath)和stop(),那么该类的代码可以如下: 当要启动该服务时,只需要初始化一个MusicPlayerService对象即可。比如可以在主Activity里面初始化一个

2014-09-26 16:21:20 1464

原创 【内核研究】Binder框架概述

Binder,英文的意思是别针、回形针。我们经常用别针把两张纸"别"在一起,而在Android中,Binder用于完成进程间通信(IPC),即把多个进程"别"在一起。比如,普通应用程序可以调用音乐播放服务提供的播放、暂停、停止等功能。Binder工作在Linux层面,属于一个驱动,只是这个驱动不需要硬件,或者说其操作的硬件是基于一小段内存。从线程的角度来讲,Binder驱动代码运行在内核态,客户端程序调用Binder是通过系统调用完成的。Binder是一种架构,这种架构提供了服务端接口、Binder

2014-09-25 19:21:41 1729 1

原创 【问题汇总】IntentService报空指针异常的问题

实现了一个IntentService子类,但是运行的时候报空指针异常。异常日志04-03 18:19:53.849: W/dalvikvm(12857): threadid=1: thread exiting with uncaught exception (group=0x40015568)04-03 18:19:53.849: E/AndroidRuntime(12857): FATAL EXCEPTION: main04-03 18:19:53.849: E/AndroidRuntime(

2014-09-24 13:52:00 5104

原创 【内核研究】Framework常见问题

Acitivity之间如何传递消息(数据)首先,提出这个问题的原因是,程序员需要在不同的Activity之间传递数据,然而,这个问题本身就有问题。所谓"传递消息"一般是指多个线程之间,而Activity本身并不是线程,ActivityThread才是一个线程,即UI线程。同一个程序中的多个Activity都由ActivityThread进行调用,Activity本身只是一个Java类而已,就像Rect、Trigle类一样,如果有人问"Rect类和Trigle类之间如何传递消息",你会不会觉得有点奇怪?

2014-09-24 10:18:07 1031 1

原创 【内核研究】客户端中的线程

在多任务操作系统中,任何程序都运行在线程之中。系统首先会为客户端程序分配一个线程,然后该线程从程序的入口处开始执行。那么,请思考以下问题。— Android APK程序中都有哪些线程?— 什么是UI线程?— 程序中自定义Thread和UI线程的区别是什么?首先,很明确地讲,包含有Activity的客户端程序至少包含三个线程,如图6-1所示。每个Binder对象都对应一个线程,Activity启动后

2014-09-23 16:33:32 1670

原创 【内核研究】程序的运行过程

首先,ActivityThread从main()函数中开始执行,调用prepareMainLooper()为UI线程创建一个消息队列(MessageQueue)。然后创建一个ActivityThread对象,在ActivityThread的初始化代码中会创建一个H(Handler)对象和一个ApplicationThread(Binder)对象。其中Binder负责接收远程AmS的IPC调用,接收

2014-09-23 15:58:55 1620

原创 【内核研究】Framework框架

Framework定义了客户端组件和服务端组件功能及接口。以下阐述中,“应用程序”一般是指“.apk”程序。框架中包含三个主要部分,分别为服务端、客户端和Linux驱动。服务端服务端主要包含两个重要类,分别是WindowManagerService(WmS)和ActivityManagerService(AmS)。WmS的作用是为所有的应用程序分配窗口,并管理这些窗口。包括分配窗口的大小,调节各窗口的叠放次序,隐藏或者显示窗口。AmS的作用是管理所有应用程序中的Activity。除此之外,

2014-09-23 15:51:12 1667 8

原创 【内核研究】理解Context

Context是什么一个Context意味着一个场景,一个场景就是用户和操作系统交互的一个过程。在广义上,这个所谓的过程应该包括前台界面和后台数据。举个例子,比如当你打电话的时候,场景包括电话程序对应的界面以及隐藏在界面后的数据。从程序的角度来看,一个Activity就是一个Context,一个Service也是一个Context。从语义的角度来看一下Context。谷歌程序员把“场景”抽象为Context类,他们认为用户和操作系统的每一次交互都是一个场景,比如打电话,发短信。从代码的角

2014-09-23 14:23:59 4728

原创 【移动开发】捕获异常信息_UncaughtExceptionHandler

当程序崩溃(Crash)的时候,默认是不对异常信息做处理的。如果想要把异常信息保存到本地文件中,或上传的服务器。那么就要借助UncaughtExceptionHandler这个类。首先,实例化UncaughtExceptionHandler,代码如下:public class ForceCloseHandler implements Thread.UncaughtExceptionHandler { public static final String LOG_FILE_NAME = "f

2014-09-22 17:27:30 5774 2

【Android案例分享】【Android 案例分享】仿QQ5.0侧滑菜单ResideMenu

使用SlidingMenu库,仿QQ5.0动画效果。 教程地址 http://blog.csdn.net/manoel/article/details/39013095

2014-09-03

ScrollView中嵌套ListView的例子

ScrollView中嵌套ListView的例子和解决方案

2014-05-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除