当前位置:  编程技术>移动开发
本页文章导读:
    ▪浅谈对java callback 以及 “钩子”的懂得        浅谈对java callback 以及 “钩子”的理解         首先,callback和“钩子”是两个完全不同的概念,callback是指:由我们自己实现的,但是预留给系统调用的函数,   我们自己是没有机会调.........
    ▪ 系统签字apk--转        系统签名apk--转 <manifest xmlns:android="http://schemas.android.com/apk/res/android"       android:sharedUserId="android.uid.system"><application android:icon="@drawable/icon" android:label="@string/app_name"       .........
    ▪ http://cdn.sencha.io/touch/sencha-touch-二-pr3.zip       http://cdn.sencha.io/touch/sencha-touch-2-pr3.zip http://cdn.sencha.io/touch/sencha-touch-2-pr3.zip ......

[1]浅谈对java callback 以及 “钩子”的懂得
    来源: 互联网  发布时间: 2014-02-18
浅谈对java callback 以及 “钩子”的理解

  

     首先,callback和“钩子”是两个完全不同的概念,callback是指:由我们自己实现的,但是预留给系统调用的函数,

 

我们自己是没有机会调用的,但是我们知道系统在什么情况下会调用该方法。而“钩子”是指:声明在抽象类中的方法,只

 

有空的或默认的实现,通常应用在模板设计模式中,让子类可以对算法的不同点进行选择或挂钩,要不要挂钩由子类决定。

 

在这里,我主要介绍callback,顺道分析了一下何为“钩子”。

 

      CallBack是回调的意思,熟悉Windows编程的人对"回调函数"这四个字一定不会陌生,但是Java程序员对它可能就

 

不太了解了。"回调函数"或者"回调方法"是软件设计与开发中一个非常重要的概念,掌握"回调函数"的思想对程序员来说

 

(不管用哪种语言)是非常必要的。

  

      那么什么是回调函数呢?我认为,回调函数就是预留给系统调用的函数,而且我们往往知道该函数被调用的时机。这里

 

有两点需要注意:第一点,我们写回调函数不是给自己调用的,而是准备给系统在将来某一时刻调用的;第二点,我们应该

 

知道系统在什么情形下会调用我们写的回调函数。

  

      这里举个现实生活中"回调函数"的例子来帮助大家更好的理解。我们平时考试答题的第一件事是干嘛?没错,是写上学

 

号和姓名。这里注意了,我们填写学号和姓名不是给自己看的(即该方法不是给自己调用的),而是给老师登记分数时看的

 

(预留给系统将来调用),这其实就是一个回调的应用。

  

下面再来看一下Android中应用到"回调"的场景。

  

场景一:

Button button = (Button)this.findViewById(R.id.button);
button.setOnClickListener(new Button.OnClickListener() {

  //回调函数
  @override
  publicvoid onClick(View v) {
    buttonTextView.setText("按钮被点击了");
  }
});

 

  上面的代码给按钮加了一个事件监听器,这其实就是"回调"最常见的应用场景之一。我们自己不会显示地去调用

 

onClick方法。用户触发了该按钮的点击事件后,它会由Android系统来自动调用。

  

场景二:

@Override
publicvoid onCreate(Bundle saveInstanceState) {
  super.onCreate(saveInstanceState);
  // You code...
}

@Override
publicvoid onResume() {
  super.onResume();
  // You code...
}

 

  上面的方法大家就更熟悉了,这是Android系统在Activity类中设置的回调函数,在Activity生命周期的不同阶段,

 

Android系统会自动调用相应的方法(onCreate, onPause, onResume,onDestroy等等)

  

      以上是两个Android中用到"回调"的场景,他们的代码实现可能不同,但是思想上是相近的,都是"回调"思想的体现。

 

 

      接下来,我们在Java中分别模拟这两个场景。

 

  (1)首先模拟注册事件监听器。先写一个监听器接口

 

package com.listener;

/**
 * 点击监听器接口
 * @author CodingMyWorld
 *
 */
publicinterface MyOnClickListener {
    publicvoid onClick();
}

 

  (2)然后写一个我们自己的Button类

 

package com.listener;

publicclass MyButton {
    private MyOnClickListener listener;
    
    /**
     * 设置具体点击监听器
     * @param listener 点击监听器实现类
     */
    publicvoid setOnClickListener(MyOnClickListener listener) {
        this.listener = listener;
    }
    
    /**
     * 按钮被点击
     */
    publicvoid doClick() {
        listener.onClick();
    }
}

 

  (3)最后模拟Client端的注册监听器和触发点击操作。

 

package com.listener;

publicclass Client {
    publicstaticvoid main(String[] args) {
        MyButton button =new MyButton();
        //注册监听器
        button.setOnClickListener(new MyOnClickListener() {

            @Override
            publicvoid onClick() {
                System.out.println("按钮被点击了");
                
            }
            
        });
        //模拟用户点击
        button.doClick();
    }
}

 

  以上就是"回调"思想在Java中事件监听的运用。

 

 

      我们再模拟第二个场景,"回调"在activity生命周期方法调用的体现。

 

      由于比较简单,我就不多做解释了,大家直接看代码。

 

package com.activity;

public abstract class Activity {
    protected void onCreate() {
        System.out.println("创建准备~~~~~~~");
    }
    
    protected void onDestroy() {
        System.out.println("销毁准备~~~~~~~~");
    }
}
package com.activity;

public class ConcreteActivity extends Activity {
    @Override
    protected void onCreate() {
        super.onCreate();
        System.out.println("创建中!!!");
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        System.out.println("销毁中!!!");
    }
}
package com.activity;

publicclass Client {
    publicstaticvoid main(String[] args) {
        Activity activity =new ConcreteActivity();
        activity.onCreate();
        activity.onDestroy();
    }
}

 

  OK,我对CallBack的理解就谈到这,有不对和能改进的地方也希望大家指正,多多交流。

 

 

1 楼 yangqinjiang 2012-03-30  
   

    
[2] 系统签字apk--转
    来源: 互联网  发布时间: 2014-02-18
系统签名apk--转
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
       android:sharedUserId="android.uid.system">
<application android:icon="@drawable/icon" android:label="@string/app_name"
                android:allowClearUserData="false" android:process="system"
                android:killAfterRestore="false">
这样应该可以了,我也是仿照那些不能被杀死的系统应用的AndroidManifest.xml写的,源码环境编译能通过,eclipse没试过



Android中如何修改系统时间(应用程序获得系统权限)

  在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真机,在logcat中总会得到"Unable to open alarm driver: Permission denied ".这个函数需要root权限或者运行与系统进程中才可以用。

  本来以为就没有办法在应用程序这一层改系统时间了,后来在网上搜了好久,知道这个目的还是可以达到的。



在windows平台通过eclipse编译android源码中,如果编译Settings或者android manifest XML中 shared user id 包含android.uid.shared等系统权限的时候,则会报以下错误。

Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE

Installation error: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE


INSTALL_FAILED_UPDATE_INCOMPATIBLE

1、由于卸载没有完全,可以使用设置中卸载相应应用,或者adb uninstall com.android.***


INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

主要是由于使用了android.uid.shared导致的问题。


  第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:

  1. 在应用程序的AndroidManifest.xml中的manifest节点中加入

  android:sharedUserId="android.uid.system"这个属性。

  2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行

  3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。


  第二个办法麻烦点,不过不用开虚拟机跑到源码环境下用make来编译:

  1. 同上,加入android:sharedUserId="android.uid.system"这个属性。

  2. 使用eclipse编译出apk文件,但是这个apk文件是不能用的。

  3. 用压缩软件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件。

  4. 使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,

  首先找到密钥文件,在我的Android源码目录中的位置

  是"build        argetproductsecurity",下面的platform.pk8和platform.x509.pem

  两个文件。

  然后用Android提供的Signapk工具来签名,signapk的源代码是

  在"build        oolssignapk"下,

  用法为"signapk platform.x509.pem platform.pk8 input.apk output.apk",

  文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。

  这样最后得到的apk和第一个方法是一样的。

  最后解释一下原理,首先加入android:sharedUserId="android.uid.system"这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就有权限来修改系统时间了。

  只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform

key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。  这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到 platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android 中的key来签名,程序在模拟器上运行OK,不过放到G3上安装直接提示"Package ... has no signatures that match those in shared user android.uid.system",这样也是保护了系统的安全。  最最后还说下,这个android:sharedUserId属性不只可以把apk放到系统进程中,也可以配置多个APK运行在一个进程中,这样可以共享数据,应该会很有用的。


如何将系统的密钥制作成keystore文件,用在eclipse下,直接使用。
命令如下:

生成.pem文件
openssl pkcs8 -inform DER -nocrypt -in testkey.pk8 -out testkey.pem  -nocrypt
生成.pk12文件
openssl pkcs12 -export -in  testkey.x509.pem -out testkey.p12 -inkey  testkey.pem -password pass:android -name testkey
生成keystore文件
keytool -importkeystore -deststorepass android -destkeystore ./testkey.keystore -srckeystore ./testkey.p12 -srcstoretype PKCS12 -srcstorepass android

最后使用eclipse导出apk时使用这个签名即可(前提:这个工程可以使用Eclipse导出)

    
[3] http://cdn.sencha.io/touch/sencha-touch-二-pr3.zip
    来源: 互联网  发布时间: 2014-02-18
http://cdn.sencha.io/touch/sencha-touch-2-pr3.zip
http://cdn.sencha.io/touch/sencha-touch-2-pr3.zip

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
oracle iis7站长之家
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3