楼主: 熊猫儿

【Android开发网上的一些重要知识4。。。。】

[复制链接]
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
41#
 楼主| 发表于 2015-1-29 15:27 | 只看该作者

A、创建Handler:

创建与本地线程相关联的Handler:

1public Handler()
2

3public Handler(Callback callback)


创建与指定线程相关联的Handler:


1public Handler(Looper looper)
2

3public Handler(Looper looper, Callback callback)


B、创建消息

1public final Message obtainMessage()

2

3public final Message obtainMessage(int what)

4

5public final Message obtainMessage(int what, Object obj)

6

7public final Message obtainMessage(int what, int arg1, int arg2)

8

9public final Message obtainMessage(int what, int arg1, int arg2, Object obj)



C、删除消息

删除在消息队列中未处理的消息

1public final void removeMessages(int what)

2

3public final void removeMessages(int what, Object object)



D、发送消息

1public final boolean sendMessage(Message msg)

2

3public final boolean sendMessageDelayed(Message msg, long delayMillis)

4

5public final boolean post(Runnable r)

6

7public final boolean postDelayed(Runnable r, long delayMillis)




使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
42#
 楼主| 发表于 2015-1-29 15:29 | 只看该作者

E、处理消息

在Looper的loop函数中循环取出MessageQueue的接收消息队列中的消息,然后调用Hander的dispatchMessage函数对消息进行处理,至于如何处理(相应消息)则由用户指定(三个方法,优先级从高到低:Message里面的Callback,一个实现了Runnable接口的对象,其中run函数做处理工作;Handler里面的mCallback指向的一个实现了Callback接口的对象,里面的handleMessage进行处理;处理消息 Handler对象对应的类继承并实现了其中handleMessage函数,通过这个实现的handleMessage函数处理消息)。

01public void dispatchMessage(Message msg) {

02

03if (msg.callback != null) {

04

05       handleCallback(msg);

06

07    } else {

08       if (mCallback != null) {

09         if (mCallback.handleMessage(msg)) {

10            return;

11         }

12       }

13

14       handleMessage(msg);

15}

16}



二、Message机制的用途

Message机制有两种用途:

定时执行:延迟到指定时间执行消息调度

线程通讯:将某些操作在其他线程中排队执行

1、定时执行

通过本线程的Handler将消息延迟到指定时间执行,相当于定时器的作用

1public final boolean sendMessageDelayed(Message msg, long delayMillis)

2

3public final boolean postDelayed(Runnable r, long delayMillis)



还可以在指定时间到期之前,通过removeMessages取消执行

2、线程通讯

Android的UI是单线程的,Android希望UI线程能够给予User快速的反应,如果UI线程花费太多的时间做幕后的事情,吵过5秒钟,Android就会给出错误提示。因此为了避免拖住UI,一下较费时的工作应该交给独立的线程去执行。但是如果幕后的线程来执行UI对象,Android又会发出错误信息,所以UI线程与幕后线程需要进行通讯。UI线程将工作分发给幕后线程,幕后线程执行后将相应的状态返回给UI线程,让UI线程对UI做成相应的更新。


使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
43#
 楼主| 发表于 2015-1-29 15:30 | 只看该作者
Android 之 Handler总结
分类: Android2012-07-01 09:39 760人阅读 评论(0) [url=]收藏[/url] 举报
androidbuttonuiclassthreadstring
一、Handler的定义:

          主要接受子线程发送的数据, 并用此数据配合主线程更新UI.

          解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。  如果此时需要一个耗时的操作,例如: 联网读取数据,    或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,,会收到Android系统的一个错误提示  "强制关闭".  这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的. 这个时候,Handler就出现了.,来解决这个复杂的问题 ,    由于Handler运行在主线程中(UI线程中),  它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。

二、Handler一些特点

        handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
        它有两个作用: (1):  安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行
      
        Handler中分发消息的一些方法
        post(Runnable)
        postAtTime(Runnable,long)
        postDelayed(Runnable long)
        sendEmptyMessage(int)
        sendMessage(Message)
        sendMessageAtTime(Message,long)
        sendMessageDelayed(Message,long)

        以上post类方法允许你排列一个Runnable对象到主线程队列中,
        sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.

使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
44#
 楼主| 发表于 2015-1-30 14:36 | 只看该作者
三、Handler实例

      (1) 子类需要继承Hendler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据

      以下为一个实例,它实现的功能为 : 通过线程修改界面Button的内容
  • public class MyHandlerActivity extends Activity {
  •     Button button;
  •     MyHandler myHandler;
  •     protected void onCreate(Bundle savedInstanceState) {
  •         super.onCreate(savedInstanceState);
  •         setContentView(R.layout.handlertest);
  •         button = (Button) findViewById(R.id.button);
  •         myHandler = new MyHandler();
  •         // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据
  •         // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象
  •         // (2): 让一个动作,在不同的线程中执行.
  •         // 它安排消息,用以下方法
  •         // post(Runnable)
  •         // postAtTime(Runnable,long)
  •         // postDelayed(Runnable,long)
  •         // sendEmptyMessage(int)
  •         // sendMessage(Message);
  •         // sendMessageAtTime(Message,long)
  •         // sendMessageDelayed(Message,long)
  •         // 以上方法以 post开头的允许你处理Runnable对象
  •         //sendMessage()允许你处理Message对象(Message里可以包含数据,)
  •         MyThread m = new MyThread();
  •         new Thread(m).start();
  •     }

使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
45#
 楼主| 发表于 2015-1-30 14:37 | 只看该作者


  •     /**
  •     * 接受消息,处理消息 ,此Handler会与当前主线程一块运行
  •     * */
  •     class MyHandler extends Handler {
  •         public MyHandler() {
  •         }
  •         public MyHandler(Looper L) {
  •             super(L);
  •         }
  •         // 子类必须重写此方法,接受数据
  •         @Override
  •         public void handleMessage(Message msg) {
  •             // TODO Auto-generated method stub
  •             Log.d("MyHandler", "handleMessage......");
  •             super.handleMessage(msg);
  •             // 此处可以更新UI
  •             Bundle b = msg.getData();
  •             String color = b.getString("color");
  •             MyHandlerActivity.this.button.append(color);
  •         }
  •     }
  •     class MyThread implements Runnable {
  •         public void run() {
  •             try {
  •                 Thread.sleep(10000);
  •             } catch (InterruptedException e) {
  •                 // TODO Auto-generated catch block
  •                 e.printStackTrace();
  •             }
  •             Log.d("thread.......", "mThread........");
  •             Message msg = new Message();
  •             Bundle b = new Bundle();// 存放数据
  •             b.putString("color", "我的");
  •             msg.setData(b);
  •             MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
  •         }
  •     }
  • }

使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
46#
 楼主| 发表于 2015-1-30 14:39 | 只看该作者
android 如何防止代码被反编译
分类: Android2012-06-29 21:04 1417人阅读 评论(0) [url=]收藏[/url] 举报
androidclassmethodsjavajarinterface

目录(?)[+]




作为Android应用开发者,不得不面对一个尴尬的局面,就是自己辛辛苦苦开发的应用可以被别人很轻易的就反编译出来。

Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了一个proguard文件夹

proguard是一个java代码混淆的工具,通过proguard,别人即使反编译你的apk包,也只会看到一些让人很难看懂的代码,从而达到保护代码的作用。

在工程的"default.properties"中添加这样一句话“proguard.config=proguard.cfg”
打包签名后的.apk就是混淆的,其实我们只要做一步就可以了就是在"default.properties"中添加这样一句话“proguard.config=proguard.cfg”就可以了。

如果想要更加复杂地混淆代码,可以详细地对该文件进行配置.




由于apk是Android虚拟机加载的,它有一定的规范,加密apk后Dalvik无法识别apk了。完全避免是不可能的,总有人能够破解你的代码。但是有几种
方式来提高被反编译取代码的难度:

1 关键代码使用jni调用本地代码,用c或者c++编写,因此相对比较难于反编译

2 混淆java代码。混淆是不改变代码逻辑的情况下,增加无用代码,或者重命名,使反编译后的源代码难于看懂。

    网上开源的java代码混淆工具较多,一般是用ant的方式来编译的

android 混淆文件proguard.cfg详解:

-injars  androidtest.jar【jar包所在地址】
-outjars  out【输出地址】

-libraryjars    'D:\android-sdk-windows\platforms\android-9\android.jar' 【引用的库的jar,用于解析injars所指定的jar类】


-optimizationpasses 5
-dontusemixedcaseclassnames 【混淆时不会产生形形色色的类名 】
-dontskipnonpubliclibraryclasses 【指定不去忽略非公共的库类。 】
-dontpreverify 【不预校验】

-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 【优化】

-keep public class * extends android.app.Activity  【不进行混淆保持原样】
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keep public abstract interface com.asqw.android.Listener{
public protected <methods>;  【所有方法不进行混淆】
}



使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
47#
 楼主| 发表于 2015-1-30 14:40 | 只看该作者

-keep public class com.asqw.android{
public void Start(java.lang.String); 【对该方法不进行混淆】
}

-keepclasseswithmembernames class * { 【保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)】

native <methods>;
}

-keepclasseswithmembers class * { 【保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。】
public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity {【保护指定类的成员,如果此类受到保护他们会保护的更好 】
public void *(android.view.View);
}

-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {【保护指定的类文件和类的成员】
public static final android.os.Parcelable$Creator *;
}




使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
48#
 楼主| 发表于 2015-1-30 14:41 | 只看该作者
android 反编译apk文件
分类: Android2012-06-29 21:01 1491人阅读 评论(1) [url=]收藏[/url] 举报
android工具dosjavajarc
安装ApkTool工具,该工具可以解码得到资源文件,但不能得到Java源文件。
安装环境:需要安装JRE1.6
1> 到http://code.google.com/p/android-apktool/下载apktool1.3.2.tar.bz2 和apktool-install-windows-2.2_r01-3.tar.bz2 文件。解压两个文件,然后把解压后的文件放在一起,如:c:\apktool
2> 在系统变量PATH中添加进aapt.exe,如:;c:\apktool\aapt.exe
3> 在DOS窗口下进入apktool.jar所在目录。执行DOS命令:apktool d -s c:\soft\xxx.apk c:\soft\source。
命令格式:apktool d [opts] <file.apk> [dir]  中的d代表解码,[opts]代表选项,-s选项代表不解码源文件。

Apktool工具只能反编译成smali的中间代码文件,这里需要借助另外一个开源工具Dex2Jar,该工具可以把dex文件转换成jar文件。这个工具不能直接翻译成java文件,但是可以把dex文件转换成jar文件
下载地址:http://code.google.com/p/dex2jar/
1> 把APK安装包中的classes.dex解压到某个目录下,如:c:\soft
2> 在DOS窗口下进入dex2jar.bat所在目录,执行DOS命令:dex2jar.bat c:\soft\source\classes.dex c:\soft\source,命令生成classes.dex.dex2jar.jar文件。

安装jd-gui工具,该工具可以把jar文件反编译成Java源文件
下载地址:http://java.decompiler.free.fr/j ... i-0.3.3.windows.zip
运行该软件,直接打开classes.dex.dex2jar.jar文件即可看到java源代码。

使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
49#
 楼主| 发表于 2015-1-31 21:48 | 只看该作者
JNI之C语言简单回顾
分类: Android2012-06-29 20:56 971人阅读 评论(0) [url=]收藏[/url] 举报
语言cjnifloatjavastruct
一.C语言基本数据类型:
c语言中  char, int, float, double, signed, unsigned, long, short and void
// java 中的8大本数据类型和他们的长度
// byte 1 char 2 short 2 int 4 long  8 double  8 float 4 boolean 1

// 在c99标准的c语言.没有 byte 类型 没有boolean 类型
// 在c语言里面 0表示的是假 非0表示的是真
// sizeof(); 获取某种数据类型的长度 , 接受一个参数(数据类型)

// c语言中的char类型是1个字节  java里面char是两个字节
// c语言中的char的长度 和 java中的byte的长度相同 ,所以可以用 c 语言中的char类型 表示 java中的byte类型
// c语言中的int 和 java中的int在内存中的长度相同 所以java的int 和c语言中的int 可以互相代替使用.

// c语言中long类型是4个字节 java中的long类型是8个字节


二. C 语言的输入函数      
//scanf();
// java 语言里面有一个数据类型 叫String 字符串
// c语言里面 是没有String类型
// c语言表示一个字符串  定义一个字符的数组
// 利用scanf %s 的方式 可以方便的从键盘获取一个字符串

三。 指针入门:
// 指针代表的就是一个内存地址. 内存地址 可以用一个指针来表示.
// 地址就是一块内存空间的编号,通过这个编号 我们可以使用以一块内存空间.

// 指针变量:  可以存放指针类型(内存地址数据)数据的变量 指针变量.
          // 使用* 来表示指针变量.
          // int*  代表的就是一个表示int类型数据地址的变量
      
补充*号的几种作用.
       // 3*5  1.*号的第一种作用 代表的是相乘的操作.
       //        2.在一个数据类型的后面 跟上一个*号 代表就是这种数据类型的指针变量
       //        3. 在一个指针变量前面加上一个*号 代表的是 访问这个指针变量里面存放的地址里面存储的内容.      
函数指针
int (*pf) ( int x, int y); // 定义一个函数的指针 这个函数 返回值为int 接受两个int类型的参数

使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
50#
 楼主| 发表于 2015-1-31 21:49 | 只看该作者
四.指针使用的常见错误:
指针的常见错误一:


      //指针变量的类型 要跟 存放数据的类型 必须要对应
       // int类型的变量的地址 要用int*来表示.
       // float类型变量的地址 要用float* 来表示.
      
指针的常见错误二:
         int i = 5;
       int* p ;
       printf("*p=%d\n",*p);  // 如果p变量没有进行初始化, 里面存放的是一个垃圾值 混乱值.
                               // *p 访问了一块不知道的内存  (野指针)                    
        
        // 指针变量 未经赋值 ,不能使用.
        // 如果修改一个野指针指向的内存空间,可能会出现严重的错误.

        //window操作系统 提供了一些api  提升父进程的权限.

五: 指针的长度
   
//所有数据类型的指针长度 都是4个字节
       //32位的操作系统, 要想表示一个地址 2的32次方个地址.
       //指针类型的 作用主要就是在指针运算的时候 起作用. 在获取指针所指向的数据的时候 起作用.
六. 多级指针
      
七. 手动分配内存
栈内存会被系统自动回收,不能被手动回收
堆内存不会被系统自动回收,需要由程序员手动回收

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表