分享

一半是火焰一半是海水: android开发

 战神* 2009-12-09

Android电源管理

Android电源管理

一、  相关概念

1.          出于节电的需要,一般应用在用户一段时间无操作的情况下屏幕变暗,然后进后休眠状态

2.          用户只能在设置->声音和显示中设置所有应用默认的屏幕亮度和进行待机的时间

3.          电源管理的实现分内核应用两部分,通过下面介绍的接口,我们可以设置应用程序的电源管理,以控制与其休眠相关的状态(是否需要进入休眠,调整cpu频率,键盘灯的开关,屏幕的亮暗等)

二、  设置电源管理常用的几种状态
PARTIAL_WAKE_LOCK                     
屏幕关,键盘灯关,不休眠
SCREEN_MID_WAKE_LOCK            
屏幕灰,键盘灯关,不休眠
SCREEN_BRIGHT_WEEK_LOCK      
屏幕亮,键盘灯关,不休眠
FULL_WAKE_LOCK                            
屏幕亮,键盘灯亮,不休眠

三、  使用电源管理注意事项

1.          可在onCreate时设置该界面的电源管理,在onDestroy时取消设置

2.          可在onResume时设置该界面的电源管理,在onPause时取消设置

3.          注意设置是以Activity为单位,不是以应用为单位

4.          注意在AndroidManifest.xml中声明该应用有设置电源管理的权限

5.          注意加锁解锁要成对出现

6.          注意多个用途最好用多个锁,不要一锁多用,以免出错

7.          注意对运行在后台和异常时对锁的处理

8.          注意在网络连接或传输时最好加锁,以免传输被中断

9.          注意加锁以保证程序逻辑

四、  代码举例

1.          源码修改

1)         引入电源管理包,以使用相关类
import android.os.PowerManager;

2)         类中加入变量
PowerManager.WakeLock mWakeLock;

3)         修改onCreate
public
void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         PowerManager pm =
                             (PowerManager) getSystemService(Context.POWER_SERVICE);
         mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK,
                            "XYTEST");
         mWakeLock.acquire();
}

4)         修改onDestroy
public
void onDestroy()
{
         super.onDestroy();
         mWakeLock.release();
}

2.          AndroidManifest.xml文件修改
<uses-permission android:name="android.permission.WAKE_LOCK"/>

11月16日

Android缩放drawable

 

一、  相关概念

1.        Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象

2.        Canvas画布,绘制的目的区域,用于绘图

3.        Bitmap位图,用于图的处理

4.        Matrix矩阵,此例中用于操作图片

二、  步骤

1.        drawable画到位图对象上

2.        对位图对象做缩放(或旋转等)操作

3.        把位图再转换成drawable

三、 示例
         static Bitmap drawableToBitmap(Drawable drawable) // drawable 转换成bitmap
         {
                   int width = drawable.getIntrinsicWidth();  
//
drawable的长宽
                   int height = drawable.getIntrinsicHeight();
                 Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888:Bitmap.Config.RGB_565;        
// drawable的颜色格式
                   Bitmap bitmap = Bitmap.createBitmap(width, height, config);    
// 建立对应bitmap
                   Canvas canvas = new Canvas(bitmap);        
//
建立对应bitmap的画布
                   drawable.setBounds(0, 0, width, height);
                   drawable.draw(canvas);     
// drawable内容画到画布中
                   return bitmap;
         }

         static Drawable zoomDrawable(Drawable drawable, int w, int h)
         {
                   int width = drawable.getIntrinsicWidth();
                   int height= drawable.getIntrinsicHeight();
                   Bitmap oldbmp = drawableToBitmap(drawable);
// drawable转换成bitmap
                   Matrix matrix = new Matrix();  
//
创建操作图片用的Matrix对象
                   float scaleWidth = ((float)w / width);  
// 计算缩放比例
                   float scaleHeight = ((float)h / height);
                   matrix.postScale(scaleWidth, scaleHeight);        
// 设置缩放比例
                   Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height, matrix, true);      
// 建立新的bitmap,其内容是对原bitmap的缩放后的图
                   return new BitmapDrawable(newbmp);      
// bitmap转换成drawable并返回
         }
}

11月11日

Android改变窗口标题栏的布局

 

一、  重点
一般应用的Title都是建立应用时在AndroidManifest.xml中配置的,或是用setTitle设置的简单字符串,要是想加入按钮,图片等多个复杂的布局,使用以下方法:
在窗口建立时,可以把一个xml布局设置成该应用的Title

二、  实例

a)       功能:把title设置成为一个字串和一个按钮的组合

b)       修改xxActivity.java代码
public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
//
注意顺序
         setContentView(R.layout.main);                                                                         
// 注意顺序
         getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
      // 注意顺序
                            R.layout.title);
}

c)          填加title.xml代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android=
http://schemas./apk/res/android
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
      <TextView android:id="@+id/text" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentLeft="true" 
        android:text="text" /> 
      <Button android:id="@+id/button" 
        android:layout_width="wrap_content" 
        android:layout_height="30px" 
        android:text="button" />
</LinearLayout>

三、  注意

a)          注意设置顺序
requestWindowFeature
要在setContentView之前
getWindow().setFeatureInit
最好在setContentView之后

b)         注意requestWindowFeature(Window.FEATURE_CUSTOM_TITLE)不要和其它对TITLE的设置requestWindowFeature(xxxx)一起使用

 

 

 

11月9日

Android程序中使用定时器Timer

 

一、  重点

1.          如何使用handlermessage

2.          如何延时调用

     1) 使用延迟发消息的方式

     2) 也可以使用android.util.Timer与handler相结合的方式
   见 http://hi.baidu.com/iammuyue/blog/item/20ef6b10bbc92377cb80c467.html

二、  举例

1.          功能:实现一个应用界面,在用户长按触模屏两秒后,打出Log信息

2.          步骤:

1)         建立project

a)          eclipse中点击菜单File->New->Project……

b)         选择Android ProjectNext

c)          填写project的各项内容如下
Project name: test_xy //
目录名, 它位于你设定的workspace之下
Package name: com.android.test //
打包名称
Activity name: .TestXy //
类名(生成文件TestXy.java)
Application name: test_xy //
可执行程序名

然后点Finish按钮

2)         修改TestXy.java代码如下
package com.android.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class TextXy extends Activity {
         /** Called when the activity is first created. */
         static final int MESSAGE_LONG_PRESS = 1;        
// 定义长按事件ID
         static final int LONG_PRESS_TIMEOUT = 2000;           
//
定义长按为2
         final Handler mHandler = new LongPressHandler();        
// 定义handler

         class LongPressHandler extends Handler {     
// handler
类的实现
                   public void handleMessage(Message msg) {              
// 事件处理函数
                            switch (msg.what) {
                            case MESSAGE_LONG_PRESS:    
// 选择事件ID
                                     Log.d("TEST_XY", "now long press!");
                                     break;
                            }
                   }
         }

         @Override
         public void onCreate(Bundle savedInstanceState) {
                   super.onCreate(savedInstanceState);
                   setContentView(R.layout.main);
         }

         public boolean onTouchEvent(MotionEvent ev) {                 
//
处理触屏事件
                   int action = ev.getAction();       
// 得到触屏动作
                   if (action == MotionEvent.ACTION_DOWN) { 
// 手指按下
                            mHandler.sendMessageDelayed(mHandler
                                               .obtainMessage(MESSAGE_LONG_PRESS),
                                               ONG_PRESS_TIMEOUT);     
// 延时2秒后发送事件
                   } else if (action == MotionEvent.ACTION_UP) {       
// 手指抬起
                            mHandler.removeMessages(MESSAGE_LONG_PRESS);
                           
// 取消延时事件
                   }
                   return false;
         }
}

3)         运行

a)          eclipse中点击菜单Run->Run Configurations……

b)         双击左边的Android Application,产生了一个New Configuration,点开它填写内容如下:
Name: yan_config //
随便起一个
Project: test_xy //
刚才起的project, 即目录名

c)          点击Apply,然后点Run,多等一会儿就出来了

d)         此时点击右上的DDMS,可看到Log信息,在长按屏幕两秒后,可看到刚才加入的Log信息

 

动态改变Android控件大小

一、  方法

使用getLayoutParams() setLayoutParams()方法

二、  示例代码
LinearLayout.LayoutParams linearParams = (LinearLayout.LayoutParams) aaa.getLayoutParams();    //
取控件aaa当前的布局参数
linearParams.height = 365;       
// 当控件的高强制设成365象素
aaa.setLayoutParams(linearParams);
// 使设置好的布局参数应用到控件aaa

三、  原理

a)          getLayoutParams() setLayoutParams()都是控件基类viewpublic方法,在外部也可以直接调用

b)         由于LayoutParams一般是在加入容器中设置的,所以容易混淆我们所指定的布局属性究竟是保存在容器中,还是控件本身的属性,答案是控件本身。但是在设置时还是要注意布局属性与容器种类密切相关

如何新建和使用Android控件

一、  重点

如何在layoutxml)中使用自定义的控件

二、  举例

1.          功能:实现一个新的浏览器控件,使点击浏览器中任何位置都能打印Log信息

2.          步骤:

1)         建立project

a)          eclipse中点击菜单File->New->Project……

b)         选择Android ProjectNext

c)          填写project的各项内容如下
Project name: test_xy //
目录名, 它位于你设定的workspace之下
Package name: com.android.test //
打包名称
Activity name: .TestXy //
类名(生成文件TestXy.java)
Application name: test_xy //
可执行程序名

然后点Finish按钮

2)         继承一个已有控件,加入新的属性和方法

a)          eclipse左侧:test_xy->src->com.android.test 点右键 New->class

b)         建立新控件:Name: MyWebView,其它使用默认选项
MyWebView.java
内容如下:
package com.android.test;

import android.view.MotionEvent;
import android.webkit.WebView;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;

public class MyWebView extends WebView {
         public MyWebView(Context context) {
                   this(context, null);
         }
         public MyWebView(Context context, AttributeSet attrs){
                   this(context, attrs, 0);
         }
         public MyWebView(Context context, AttributeSet attrs,int defStyle) {
                   super(context, attrs, defStyle);
         }       
//
注意实现带三个参数的构造函数
         public boolean onTouchEvent(MotionEvent ev) {
          // 加入新功能
                   int action = ev.getAction();
                   Log.d("XY_TEST", "now recv key: " + action);
                   return super.onTouchEvent(ev);
         }
}

3)         修改xml文件

a)          eclipse左侧:test_xy->res->layout->main.xml修改其中内容如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=
http://schemas./apk/res/android
         android:orientation="vertical" android:layout_width="fill_parent"
         android:layout_height="fill_parent">
         <TextView android:layout_width=
"fill_parent"
                   android:layout_height="wrap_content"
                   android:text="@string/hello" />
         <com.android.test.MyWebView
                   android:id="@+id/myview" android:layout_height=
"fill_parent"
                   android:layout_width="fill_parent" />
</LinearLayout>
注意使用全名, com.android.test.MyWebView, 否则找不到新控件

4)         运行

a)          eclipse中点击菜单Run->Run Configurations……

b)         双击左边的Android Application,产生了一个New Configuration,点开它填写内容如下:
Name: yan_config //
随便起一个
Project: test_xy //
刚才起的project, 即目录名

c)          点击Apply,然后点Run,多等一会儿就出来了

d)         此时点击右上的DDMS,可看到Log信息,在触摸WebView控件时,可看到刚才加入的Log信息

 

 

修改android公共控件和后台服务

1.   位置
公共控件的代码在源码目录android/frameworks/base/core/java/android/
后台服务的代码在源码目录android/frameworks/base/services/java/android/server

2.   修改
修改其中代码并执行mm编译
形如:
$ cd frameworks/base/services/java/com/android/server/
$ vi IntentResolver.java
$ mm

3.   替换
编译后用生成的包替换手机上/system/framework/中相应的包
编译后生成的文件见提示
形如:
$ cd out/target/product/general/system/framework/
$ adb push services.jar /system/framework/

4.   使新的包生效

a)          方法1:
重启手机后生效

b)         方法2:
杀死system_server进程,使系统重新启动,这种方法速度快

$ ps
找到system_server对应的pid, 假设它为1219
$ kill 1219

5.   注意

a)          绝大多数情况下都能成功,不过最好在替换前备份原有jar

b)         如果替换重要的包使机器不能启动到桌面了,可以通过重新打包system.img,然后重新烧写(fastboot)到系统中解决此问题,注意system.img的大小
$ ./out/host/linux-x86/bin/mkyaffs2image -f out/target/product/generic/system out/target/product/generic/obj/PACKAGING/systemimage_unopt_intermediates/system.img
$ out/host/linux-x86/bin/acp -fpt out/target/product/generic/obj/PACKAGING/systemimage_unopt_intermediates/system.img out/target product/generic/system.img
$ fastboot flash system system.img

此时用fastboot烧写方式重启手机

 

建立Android SDK开发环境

建立SDK开发环境

 

一、  系统平台
Linux
系统:ubuntu 8.04,最好用ubuntu系统,否则可能遇到缺少库,编译器版本不对等一系列问题,安装和使用详见文档《ubuntu系统的使用》

二、  安装JDK

1.          为什么使用JDK
用以支持AndroidEclipseAndroid中的应用都是java程序,所以想在Linux上建立开发Android环境,就需要安装java虚拟机

2.          安装方法

     使用ubuntu安装包
$ sudo apt-get install sun-java6-bin

4.          测试是否安装成功
$ java -version

三、  安装Android SDK

1.          为什么使用Android SDK
Android SDK
包含创建和运行 Android 应用程序所需的一切,包括设备仿真器和高级调试工具,如果你只想看看Android运行起来什么样,那只安装它就可以

2.          安装

1)         注意选择你所使用平台和硬件对应的版本
平台windows, linux, mac
版本1.0, 1.5, 1.6…

2)         下载
打开网页http://code.google.com/android/download_list.html
下载android-sdk-linux_x86-1.0_r1.zip

3)         安装
$ unzip  ../recv/android-sdk-linux_x86-1.0_r1.zip
无需编译,解开就能运行

3.          运行
$ cd android-sdk-linux_x86-1.0_r1/tools
$ ./emulator -datadir ../../                
// datadir是一个必须存在的目录,用来存放数据
耐心等待,特别特别的慢,看到主菜单大概要三四分钟,请注意,安装到这一步,android就能在你的Linux系统中运行了

4.          设置路径
$ export PATH=$PATH:/exports/android/test/android-sdk-linux_x86-1.0_r1/tools
最好把环境变量的设置加入$USER/.bashrc脚本中

5.          创建并使用模拟的500M SD
$ ./mksdcard -l SD500M 500M ../../sd500m.img      
建立虚拟SD卡的映像文档
$ ./emulator -sdcard ../../sd500m.img -datadir ../../

6.          缩放屏幕0.5
$ ./emulator -scale 0.5 -datadir ../../

7.          SDK目录结构

1)         Add-ons
扩展的第三方库所在目录(如现在所放的地图库)

2)         Docsdocumention.html
本地和网上提供的SDK文档

3)         Platforms
1.11.5两种
SDK
Samples
其中含示例代码

android.jar
java打包文件,其中包含构建应用程序的所有Android SDK

4)         Tools
构建应用程序的命令行工具(adb, emulator…

5)         Usb_driver
Android
G1)设备连接计算机后所需的驱动程序,只有Window平台需要,Linux平台可以自动识别

四、  安装eclipse

1.          为什么使用eclipse
eclipse
是一个基于java的开发平台,它是一个框架,通过安装插件构建开发环境,java就是它的插件,android也是一组插件,我们利用它用发和调试运行在android上的程序

2.          安装

1)         下载
打开网页http://www./downloads/ 
下载Eclipse IDE for Java EE Developers

2)         解压
tar xvzf ../download/eclipse-jee-ganymede-SR1-linux-gtk.tar.gz

3)         运行
cd eclipse
./eclipse
使用默认的workspace就可以了

3.          安装androideclipse插件

1)         eclipse中点击菜单Help->Software Updates……

2)         切换到Available Software标签,点Add Site……按钮

3)         在弹出的对话框里输入https://dl-ssl.google.com/android/eclipse/,然后按OK

4)         选项新出新的Developer tools然后点Install……

a)          Android Developer Tools

b)         Android DDMSDalvik Debug Monitor Service
查看线程,堆栈,内存占用,广播,虚拟GPS坐标等

5)         Next,然后Finish

6)         重新启动Eclipse后生效

4.          指定Android SDK对应的目录

1)         eclipse中点击菜单Window->Preferences

2)         左侧选Android,右侧选Browse……,指定你android SDK的安装目录

3)         点击Apply,然后点OK

五、  配置AVDAndroid Virtual Device

1.          用于配置一些模拟器的特性:模拟器影像大小/触摸屏/轨迹球/摄像头/屏幕分辨率/键盘/GSM /GPS/Audio录放/SD卡支持/缓存区大小等

2.          如果用SDK1.5可能出现提示让你建立AVD
Name:AVD1.5
Target: Android 1.5 - 1.5
SDCard: 64M
Create AVD
然后再点finish即可

六、  第一个android程序

1.          建立project

1)         eclipse中点击菜单File->New->Project……

2)         选择Android ProjectNext

3)         填写project的各项内容如下
Project name: test_xy  
目录名, 它位于你设定的workspace之下
Package name: com.android.test 
打包名称
Activity name: TestXy         
好像是类名(生成文件TestXy.java)
Application name: test_app_name   
可执行程序名

然后点Finish按钮

2.          填写代码
这时可以看到代码界面了,从左边的树中打开代码
test_xy 
à src à com.android.testxyà TestXy.javaà TestXy à onCreate
修改其中代码(不改也行) 

3.          运行

1)         eclipse中点击菜单Run->Run Configurations……

2)         双击左边的Android Application,产生了一个New Configuration,点开它填写内容如下:
Name: yan_config //
随便起一个
Project: test_xy  //
刚才起的project, 即目录名

3)         点击Apply,然后点Run,多等一会儿就出来了

 

 

 

建立Android源码开发环境

Android源码的编译

一、  配置环境

1.          磁盘
需要6G以上剩余空间

2.          Linux系统

Ubuntu 6.06以上版本,我用的是buntu 8.04,具体请见下篇文档《ubuntu系统的使用》

3.          Git工具(Git 1.5.4以上版本)
它是类似CVS的版本管理工具,如果你的代码不用从网上下载,而是从别人处复制,则无需此工具

$ sudo apt-get install git-core gnupg

4.          Java环境(JDK 5.0 update12以上版本)
$ sudo apt-get install sun-java6-jdk
具体安装请见上篇文档《Android环境的搭建》

5.          Python (Python 2.4以上版本)
http://www./download/下载2.4以上版本
$ tar xvzf python-2.4.5.tgz
$ cd python-2.4.5/
$ ./configure
$ make; make install

6.          依赖的deb
$ sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl
其中flex bison build-essential zip curl可以从光盘安装
其余gperf libsdl-dev libesd0-dev libwxgtk2.6-dev需要从网上安装,它们还依赖一些安装包,所以要用apt-get下载,不要直接下deb包安装

7.          调试工具
$ sudo apt-get install valgrind

二、  下载及编译运行android源码

1.          下载安装脚本
$ wget http://android.git./repo
$ chmod 777 repo
$ cp repo /bin/

2.          用安装脚本下载源码
$ mkdir android_code
$ cd android_code
$ repo init -u git://android.git./platform/manifest.git
$ repo sync

以上命令是下载最新版本,也可以下载其它版本
如我买的手机,在设置->关于手机->固件版本中看到是1.5,所以下载1.5版本,方法如下
$ repo init -u git://android.git./platform/manifest.git -b android-1.5r3
$ repo sync
 // 此后会长时间下载

3.          编译

1)         正常编译
$ cd android_code
$ make
映像编译成功后会在目录 android_code/src/out/target/product/generic 下产生一些image文件:ramdisk.img system.img userdata.img

2)         可能出现的问题及解决方法

1.          make若提示找不到-lncurses,则需要做以下链接
ln –s /lib/libncurses.so.5 /lib/libncurses.so

2.          make若提示找不到run-java-tool,则需要设置java的安装路径
$ export ANDROID_JAVA_HOME=$JAVA_HOME

3.          若提提示找不到zlib.h, 则运行如下命令安装zlib开发包
$ sudo apt-get install zlib1g-dev

4.        下了一个最新版本后显示说只能使用java-1.5版本,于是从1.6版本降回1.5
$ sudo apt-get install sun-java5-jdk flex
$ sudo update-java-alternatives -s java-1.5.0-sun

5.          如果报错 "compression requires the missing zlib module" 可能是python找不到zlib
这时需要先安装zlib, 然后重编python, 并取代当前版本python
$ sudo apt-get install zlib1g-dev
$ python2.6 --version

可看到当前版本, 下载当前版本, 重新编译安装
$ tar xvzf python-2.6.2.tgz
$ cd python-2.6.2/
$ ./configure --prefix=/usr/local
$ make; make install

3)        编译sdk
$ make sdk
此时SDK产生于此目录下:android_code/out/host/linux-x86/sdk/
此包如同下载的sdk包,可供eclipse使用,注意把它移动其它位置使用,否则一编译其它应用,它就被删除掉了

4)         编译不同Android硬件平台对应版本
需要在make前先针对设备进行设置,形如:
$ choosecombo 1 1 8 3
使用不同参数,编译结果存存储的目录不同
默认包生成目录:android_code/out/target/product/qsd8250_surf/system/app/*.apk
以上选项包生成目录:android_code/out/target/product/generic/system/app/*.apk

4.          运行

1)        运行普通的虚拟器emulator
emulator
的路径是:

/home/xieyan/bin/android_code/out/
host/linux-x86/bin/emulator
设置环境变量
export PATH=$PATH:android_src/out/host/linux-x86/bin
$ . build/envsetup.sh
$
partner_setup
$ emulator

2)         指定img运行
$ export   ANDROID_PRODUCT_OUT=/home/xieyan/bin/android_code/out/target/product/generic
$ emulator -image system.img -data userdata.img -ramdisk ramdisk.img

三、  常用的源码文件

1.          frameworks/base/core/java/android/widget/下边
Android
系统控件的实现

2.          package/apps
普通应用程序的实现

3.          out/target/product/generic/system/apps/*.apk
安装包生成的位置

四、  参考

1.          官方网站的安装说明
http://source./download

 

11月6日

android源码中常用于参考的代码

在应用开发时,常遇到有些功能不知是否能实现,不知如何实现的问题,在网上资料又不多的情况下,可以用参考已有源码的方式来解决这些问题,经常参考的目录如下

 

1、   系统控件的实现:了解有什么控件,控件的功能,功能如何实现
frameworks/base/core/java/android/*

2、   应用程序的实现:Android系统中所有的应用程序都在这里实现,了解它们如何实现
package/apps/*

3、   系统提供的例程:各种类型程序的实现范例
development/samples/*

 

11月3日

Android常用工具

一、  Log

1.        logcat不同级别的打印信息,级别如下
V    Verbose
D    Debug
I    Info
W    Warn
E    Error
F    Fatal
S    Silent

2.        如何在log里打行号和时间
getFileName ()
getClassName ()
getMethodName ()
getLineNumber ()

二、  Adb

1.        把程序装手机里:一般程序装apk即可

1)        手机打开,边上usb线,直接连上电脑

2)        系统ubuntu 8.04
sdk
android-sdk-linux_x86-1.5_r3/tools/adb shell
root权限(因为连接真机,若边模拟器就无所谓哪个用户了)

3)        使用命令adb devices看设备是否连上了
如果同时启了模拟器和连接了手机,adb会让你选择与谁连接

4)         注意:如果你有多个SDK,千万要使用匹配的adb命令,最好用绝对路径,否则很容易得到提示说找不设备,如果说找不到adb,请尝试以下方法
$ killall adb

$ rmmod ehci_hcd
$ ./adb kill-server
$ ./adb start-server

2.        adb常用参数

1)        adb devices
察看手机是否连接(手机需要打开 USB debug)

2)        adb pull <A> <B>
A
为手机路径,B为电脑路径,意思为:把文件从手机复制到电脑上

3)        adb push <B> <A>
A
为手机路径,B为电脑路径,意思为:把文件从电脑复制到手机上

4)        adb remount
得到手机的系统文件读写权

5)        adb install 包名
安装pc中的apk软件到手机

6)        adb shell
进入手机的超级终端Terminal

3.          adb shell

1)         看当前log信息
# logcat

2)         adb shell用普通shell命令
# busybox df
# busybox ls

3)         android上的网络调试
adb shell
支持以下命令

a)          # ping
发出 ping 命令,查看 Google.com 是否可用

b)        # ifconfig
lo 是本地或 loopback 连接。 
tiwlan0  WiFi 连接

4)        数据库使用与调试

a)          操作数据库
# cd /data/data/com.android.mails/databases/
# sqlite3
库名
sqlite > select * from
表名
Ctr+D
退出
程序中参见关键字: execSQL, rawQuery

b)         查看数据字典
sqlite > .sch

 

Android基本组件及其交互

一、  Android的基本组件

1.          Activity
应用程序中每个屏幕显示都通过继承和扩展基类
Activity
在一个应用程序中每个Activity都是独立的

2.          Service
Service
是没有可见的用户界面,但可以长时间在后台运行

3.          Broadcast
用户接受广播通知的组件,广播是一种同时通知多个对象的事件通知机制

应用程序注册不同的Broadcast Receiver,从而接收不同广播通知
不实现图形界面

4.          Content Provider
应用程序彼此间需要共享资源,数据通讯时,采用content provider机制

它能将应用程序特写的数据提供给另一个应用程序使用

二、  组件间的通讯

1.          ContentProvider用于提供,ContentResolver用于调用

2.          Intent
用于在不同组件间传递消息:
Activity, Service, Broadcast
Intent
一般带有一个组件对另一组件的请求的动作名称,请求动作及相关数据

1)         Activity相互调用
Intent in = new Intent(ac01.this, pickup.class);
startActivity(in);

2)         ActivityBroadcast相互调用
public class
AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent)
    {
        ac01 app = ac01.getApp();
        app.btEvent("from AlarmReceiver");
    }
}
Intent intent = new Intent(ac01.this, AlarmReceiver.class);
PendingIntent p_intent = PendingIntent.getBroadcast(ac01.this, 0, intent, 0);
// We want the alarm to go off 30 seconds from now.
long firstTime = SystemClock.elapsedRealtime();
firstTime += 800;
// Schedule the alarm!
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 800, p_intent);

3)         ActivityService相互调用
public class
NotifyService extends Service{
    @Override
    protected void onCreate() {
        ac01 app = ac01.getApp();
        app.btEvent("from NotifyService");
    }
    @Override public IBinder onBind(Intent intent) { return null; }
}
context.startService(new Intent(context, NotifyService.class));

 

Android界面开发

一、  界面元素

1.          窗口:Activity
应用程序中每个屏幕显示都通过继承和扩展基类Activity实现

分类:基本Activity,带内容的Activity(如ListActivity

2.          对话框:Dialog
一种显示于Activity之上的界面元素,由Activity管理,用于显示一些临时信息和功能,它比Activity开销小

1)         常用对话框:
AlertDialog
:信息对话框
DatePickerDialog
TimePickerDialog:时间日期选择对话框
ProgressDialog
:进度对话框
还可以设置对话框内容为我们自定义的View

2)         相关函数:
onCreateDialog()
:创建对话框的实现
showDialog()
:需要显示的时候调用
onPrepareDialog()
:更改已有对话框时调用

3.          菜单:Menu
一种显示于Activity之上的界面元素,由Activity管理,用于提供用户一些额外的选项和设置

1)         常用菜单:
Options Menu
:按Menu键时从屏幕底部滑出的菜单
Context Menu
:用户通过在按件上长按调出它
Submenu
:用于给菜单分类,可被添加到其它菜单上,不能添加到子菜单上

2)         相关函数:
onCreateOptionMenu()
:创建菜单 onCreateContextMenu…
onOptionsItemSelected()
:处理菜单项的单击事件
onPrepareOptionsMenu()
:动态更新

4.        可视化控件:View
View
是可视化控件的基类

1)        常用控件:
TextView, ImageView
Button, CheckBox, RadioButton, ImageButton, ToggleButton
AnalogClock, DigitalClock
EditText, List…

2)        数据绑定:adapter
adapter
将控件(如List, GridView)和复杂数据(如数据,键表)绑定起来

5.        其它界面元素
标题栏

二、  布局的实现
设置控件在屏幕上如何排布

1.        LinearLayout:线性的布局方式
最常用,上下或左右的添加控件

2.        GridView:网格布局
控件按照顺序依次填到每个格子里就好了,使界面很整齐

3.        TableLayout:表格布局
以行列形式管理子控件,每行为一个TableRowTableRow可添加子控件

4.        AbsoluteLayout:绝对坐标布局
可以让子元素指定准确的x/y坐标值,并显示在屏幕上。(0, 0)为左上角。
AbsoluteLayout
没有页边框,允许元素之间互相重叠(尽管不推荐)。
不推荐使用,因为其在不同的设备上可能不能很好地工作。

5.        RelativeLayout:相对坐标布局
控件可指定他们相对于其它元素或父元素的位置(通过ID指定)。
可以以右对齐,或上下,或置于屏幕中央的形式来排列两个元素。

6.        FrameLayout:单帧布局
所有的子元素将会固定在屏幕的左上角,后一个子元素将会直接在前一个子元素之上进行覆盖填充

三、  事件响应

1.          用注册回调函数的方式响应事件

2.          如果没被任何一个View处理,则由Activity处理

3.          常用事件处理

1)         onKeyDown()

2)         onKeyUp()

3)         onTrackballEvent()

4)         onTouchEvent()

四、  应用软件代码结构

1.        res:资源
资源是在代码中使用到的并且在编译时被打包进您的应用程序的附加文件
在代码中通过R类调用(R类自动生成,形如R.string.title)

1)        layout:存放布局用的xml文件

a)        布局就像容器,里面可以装下很多控件,每个控件又有布局,字体设定,
如字体大小在layoutxml里使用:
Android:textAppearance=”?android:attr/textAppearanceSmall”

b)        默认的布局文件main.xml

2)         drawable:存放图片图标

3)         values:存放常量的xml文件(如字串)

2.          src:代码

3.          AndroidManifest.xml
包含应用程序的基本信息,有哪些组件,哪些资源

1)         应用程序的java包名

2)         应用程序中所含组件(Activity, Service, BroadcastReceiver, ContentProvider

3)         应用程序调用其它程序时的权限

4)         应用程序被其它程序调用时对其它程序的权限要求

5)         使用Android API的最低版本

6)         应用程序依赖的库

五、  国际化的支持(多语言)

1.        在系统中如何设置本地语言
桌面->settings->Local & text->Select locale->Chinese(China)

2.        在程序中如何加入多语言支持
res/value
中是默认的字体
把它复制一份成为res/value-zh-rCN文件夹,然后把其中文字改为简体中文

3.        在不改变系统设置的前提前,测试当前应用对某一语言的支持
import java.util.Local; //
引入相关类
import android.util.DisplayMetrics;

OnCreate函数中加入以下本地化设置
Resources res = getResources();
Configuration conf = res.getConfiguration();
conf.locale = Locale.SIMPLIFIED_CHINESE;  //
设置为简体中文
DisplayMetrics dm = res.getDisplayMetrics();
res.updateConfiguration(conf,dm);
编译后再运行程序时,读取的字串就是res/value-zh-rCN目录中strings.xml里的文字了

六、  常见问题及解决方法

1.        android.app.Application
创建一个属于你自己的android.app.Application的子类,然后在manifest中申明一下这个类,这是android就为此建立一个全局可用的实例,你可以在其他任何地方使用Context.getApplicationContext()方法获取这个实例,进而获取其中的状态

2.        用别人写的java文件改出自己的,R.xx报错
由于资源找不对,要把它的res文件和AndroidManifest.xml内容也做相应替换,注意xml里边要改成自己的类名

3.        android中可以使用java中的类吗
一般数据结构使用它,而界面使用android自带的界面元素

4.        layout中的控件与程序中控件的关系
平等的,layout中的控件用R.id.xxx得到

5.        布局冲突
requestWindowFeature
setContentView冲突

七、  android是重要的包
android.app
:提供高层的程序模型、提供基本的运行环境
android.content
:包含各种的对设备上的数据进行访问和发布的类
android.database
:通过内容提供者浏览和操作数据库
android.graphics
:底层的图形库,包含画布,颜色过滤,点,矩形,可以将他们直接绘制到屏幕上.
android.location
:定位和相关服务的类

android.media
:提供一些类管理多种音频、视频的媒体接口
android.net
:提供帮助网络访问的类,超过通常的java.net.* 接口
android.os
:提供了系统服务、消息传输、IPC 机制
android.opengl
:提供OpenGL 的工具
android.provider
:提供类访问Android 的内容提供者
android.telephony
:提供与拨打电话相关的API 交互
android.view
:提供基础的用户界面接口框架
android.util
:涉及工具性的方法,例如时间日期的操作
android.webkit
:默认浏览器操作接口
android.widget
:包含各种UI 元素(大部分是可见的)在应用程序的屏幕中使用

 

Android模拟器调试与真机调试

一、  模拟器调试与真机调试

1.          模拟器调试
运行源码或SDK中的emulator,加参数

2.          真机调试

1)         usb线连接G1硬件和PC

2)         若是windows系统,则安装驱动

3)         用源码或SDK中的adb命令看硬件是否连接成功
$ adb devices
正常调试

4)         注意:

a)          Linux连接真机时需使用root权限

b)         如果之前连接过模拟器,最好连接前先杀掉adb后台进程
$ killall adb

3.          Eclipse中调试
若连接真机,未打开模拟器时,直接连接真机调试
若未连接真机,已打开模拟器时,在当前模拟器中调试
若未连接真机,也未打开模拟器时,打开模拟器调试
若只开多个真机或多个模拟器时,同时有多个可连接的设备,弹出列表供用户选择

4.          命令行中使用adb工具调试
连接多个设备时,需要用命令行参数指示设备名或设备类型
$ adb –s
设备名shell  设备名由adb devices列出
$ adb –d shell   
与硬件设备相连
$ adb –e shell
与模拟器相连


Android系统文件结构

一、  镜像文件image

1.          如何得到镜像文件

1)         编译android源码之后,在out/target/product/generic产生
ramdisk.img
system.imguserdata.img

2)         SDKplatforms\android-*\images
ramdisk.imgsystem.imguserdata.img

2.          各镜像文件的含义

1)         system.img是由 system目录打包压缩得到的,以只读方式挂载。

2)         userdata.img是由 data目录打包压缩得到的,以读写方式挂载,用于存放用户数据,用户安装的软件包在被装在这里。

3)         ramdisk.img是模拟器的文件系统,把ramdisk.img解压出来可知道,ramdisk.img里的文件和根文件夹的文件基本一样。

3.          镜像文件的挂载顺序
模拟器装载ramdisk.img并解压到内存,接着分别把system.imguserdata.img挂载到 ramdisk下的systemdata目录。

4.          如何更改系统的镜像文件

1)         模拟器
运行模拟器时指明镜像文件名参数,可以使用新生成的镜像文件

2)        真机
通过烧写替换原有镜像文件

二、  系统目录说明

1.        应用程序安装目录

1)        系统应用程序所在目录
/system/app/*.apk

2)        用户安装应用程序所在目录
/data/app/*.apk

3)        注意:

a)        在模拟器中,每重启一次,/system/app/下的应用都会被还原,有时/data/app下也会被清除

b)        若在/system/app/data/app下有重名的应用,不一定会启动哪一个,尤其是在adb install杀死正在运行的程序时,有时旧的就会被启动

2.        用户数据所在目录
/data/data/
应用包名/shared_prefs 配置文件
/data/data/
应用包名/databases/*  库文件所在目录

3.        SD卡对应目录
/sdcard/

 

安装和卸载Android应用程序(apk包)

一、  安装

 

1.          安装第三方应用
$ adb install apk
文件名

2.          安装系统应用
$ adb remount
$ adb push apk
文件名 /system/app    // apk文件名形如testme.apk

二、  卸载

1.          $ adb uninstall 包名 // 包名形如com.android.testme

2.          Home->设置->应用程序->管理应用程序->选择某应用程序->卸载

三、  相关文件

1.          /system/app/apk文件
系统应用

2.          /data/app/包名.apk
第三方应用

3.          /data/data/包名
此位置用于存储用户数据

4.          /data/dalvik-cache/组合名.dex
dex
文件是Android 虚拟机Dalvik 支持的字节码文件格式

5.          /data/data/com.android.launcher/databases/launcher.db
Launcher
Android应用程序的启动器,launcher.db是应用程序数据库。

若应用程序数据发生混乱,删掉数据库文件,并杀掉com.android.launcher进程,再使Launcher重新启动并重新生成应用程序数据库,以恢复错误
$ adb shell
$ cd /data/data/com.android.launcher/databases/
$ rm launcher.db

$ ps //
找到com.android.launcher对应的进程号
$ killall
进程号
重新进入应用列表界面(Home),此时launcher自动被重启,数据库重新生成

四、  apk的格式
apk
文件将AndroidManifest.xml 文件、应用程序代码(.dex 文件)、资源文件和其他文件打成一个压缩包
$ mv testme.apk xx.zip
$ mkdir tmp; cd tmp
$ unzip ../xx.zip
此时可看到apk包中的内容

10月12日

从c++到java (二)

学习JAVA编程(二)

 

一、  JAVA特性和习惯用法

1.          指针
JAVA
中没有指针,用以下方法使用
Test a = new Test(); a.t();

2.          地址传递和值传递
原始类型是值传递
对象 (非原始)类型是地址传递

3.          手动回收资源
一般情况下,只要new,系统会自动释放,但更严谨地做法是手动回收,如下:
Employee e1 = new Employee( "Susan", "Baker" );
……
e1 = null;
System.gc();      // garbage collection

此时析构函数protected void finalize()会被调用

4.          内嵌类(一个类中声明另一个类)

1)         内嵌类可以放在类中的任意一个位置,程序都可以找到它

2)         内嵌类的好处
内嵌类可以使用所属类的私有变量和方法
内嵌类的作用域只在所属类内部,其它类是不可见的,从而减少混乱
节约资源

5.          匿名内嵌类(anonymouse inner class)

1)        没有具体名字的内嵌类,因为只使用一次,所有一般不命名

2)        写法
fancyButton.addActionListener
(
    new ActionListener()  // ActionListener
是一个interface, 含一个方法
    {// anonymous inner class
        public void actionPerformed( ActionEvent event )
        {
            JOptionPane.showMessageDialog( null,
                "You pressed: " + event.getActionCommand() );
        }
    }
);
它返回的是一个实例,只处理从这个handler来的信息

3)        运行时生成内嵌类的class文件,形如
xxx$1.class

6.          事件处理

1)         引入java.awt:事件处理包

2)         需要设置listenerhandler

3)         任何一个对象都可以被监听(addListener, 当它listen的事件发生时就调add时指定的handler处理

7.          多线程

1)        继承Thead

2)        关键的方法
start()
sleep()destroy()resume()stop()getName()

3)        线程执行优先级1-10

4)        在外部使用它
PrintThread thread1 = new PrintThread( "thread1" );
thread1.start(); //
此时进入ready状态,等待资源

8.        界面

1)        引入java.swingJFC (用于在java中开发界面)

2)        由于基类原因,控件即可以draw也可以做为contrainer

二、  JAVA对应语法

1.        类的引入

1)        在某一类(文件)中想使用其它类时(如同C语言中的包含头文件)

2)        使用import关键字,形如
import java.io.*

2.        工具函数的写法
C++
中有些工具函数,可能被多处调用,本身又不属于某个类,在JAVA中可以专写一个Utility.java,里边的函数都是static的,直接用里边的函数,不用实例化

3.          枚举

近似类的写法,形如:
public enum FolderType {
    HOLDS_FILDERS, HOLDS_MESSAGES
}
FolderType.HOLDS_FILDERS

4.          宏定义
类中
public static final int IOERROR = 1;

5.          ifdef
没有ifdef类似的功能可以使用,只能用常量或变量的判断来选择执行代码的不同部分

 

 

 

从c++到java (一)

学习JAVA编程(一)

 

一、  目的
由于之前都用C/C++写程序,现在改用JAVAandroid程序,有些相关的认识和积累,记录下来,自已保存资料,也供大家参考,帮助您在和我遇到同样问题的时候,可以快速解决。
我遇到的问题基本分以下几类:

1.          不了解程序的流程:编译,执行,如何代码组织

2.          看不懂别人写的程序:重要的关键字不认识

3.          JAVA的特性和习惯用法:不明白什么意思

4.          某些功能不知如何实现:找不到JAVA对应的语法

二、  流程

1.          组织代码

1)         以类组织
整个JAVA语言建立在类的逻辑结构上,任何想法都必须封装在类中,也就是说不允许函数,变量定义在类以外。

2)         程序入口
既然所有函数都必须封装在类中,主函数(main)也不例外,哪个类是入口,就把main放在该类里边。对其它类和方法的调用可以写在main中,形如:
public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("Hello World!");
    }
}

3)         文件类型

a)          *.java
源程序代码文件

一般一个类写在一个.java文件中,也可以把两个类写在一个java文件中,编译出来成两个.class
public
的类因于供他人调,所以要单写一个java文件,文件的名字和类名一致

b)         *.class
编译后生成的字节码文件

c)        *.jar
JAVA
程序的打包文件(类似ZIP包,可用WINRAR等工具打开)

2.          编译
编译单个文件
$ javac xxx.java
编译多个文件
$ javac *.java
注意xxx要和类名统一,此时当前目录下生成xxx.class文件

3.          执行

1)         运行xxx.class
$ java xxx
注意不加扩展名

2)         运行xxx.jar
$java -classpath xxx.jar packagename.classname
解压缩xxx.jar, 其中的目录是package, 其中的文件是class
xxx.jar
通常是由工具生成的,含有一些字节码文件和信息文件

三、  关键字

1.          thissuper

1)         this指当前对象,super指它的父类

2)         super用法

a)          放在构造的头一句,调用它父类的构造函数(注意只能放在头一句)

b)         super.func(xxx)是调父类的一个函数,通常用于本类中重写(override)了父类的函数,用此方法调用其父类中的该函数

2.          try, cache, finally

1)         try:把可能出错的代码放在try {}里,有些代码加了try就可以编译通过了

2)         cache:把错误处理放在catch (xxx) {}中,可有多个catch同时存在过不同参数指定不同错误的处理

3)         finally:无论发没发生意外,finally{}都被执行,它用来释放try申请的资源(如操作数据库时)

3.          abstract class(抽象类)与instance class(具体类)

1)         instance class可以实例化,abstract class不能实例化

2)         abstract class里边抽象的方法用public abstract func();它定义了方法,但没有实现,就是C++里的纯虚函数

4.        abstract classinterface

1)        它们都用于实现多样性(Polymorphism),即继承它的类实现各有不同

2)        interface可以虚拟多重继承而abstract class不能

3)        abstract class可以有自己的数据成员,也可以有非abstract的成员方法,而interface方式实现中,只能有静态的不能被修改的数据成员(static final),所有的成员方法都是abstract

4)        本质不同:abstract的父子类间本质相同,而interface只是定义了某个方法约定或者说是性质

5.          extendsimplements

1)        extends:继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承

2)        implementsJAVA中不支持多重继承,但是可以用interface来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了,形如:
class A extends B implements C,D,E

3)        extends用在类名和接口名前
implements
用在接口名前

6.        throwthrows

1)        它们java处理异常方式

2)        throw用在try后面

3)        throws用在一个方法后面

7.          final

1)         用于修饰非抽象类,非抽象方法和变量

2)         final类:不能被继承,final类的方法默认是final

3)         final方法:不能被子类方法覆盖,可以被继承,编译时被转入内嵌机制,提高执行效率

4)         final变量:只能被赋值一次,之后不能再改变
通常用static final声明常量,注意常量一般用大写

8.          static

1)         用于修饰成员变量和成员方法

2)         static变量和方法独立于该类的任何对象,被类的所有实例共享,所以不需要声明任何对象就可以访问,形如:
类名.静态方法名(参数列表)
类名.静态变量名

3)         注意静态方法不能用thissuper关键字

4)         static方法必须被实现,不能是抽象的

9.          layout
layout
:设置容器中的排布方式
FlowLayout   
按添加的顺序从左到右从上到下排布
BorderLayout 
按东西南北中设定位置
GridLayout   
网格布局
BoxLayout
使需要空间的组件得到最大尺寸

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多