blogjava-凯发k8网页登录

blogjava-凯发k8网页登录http://www.blogjava.net/tigertian/----tigertianzh-cnsat, 08 apr 2023 20:40:10 gmtsat, 08 apr 2023 20:40:10 gmt60mvc/mvp/mvvmhttp://www.blogjava.net/tigertian/archive/2017/05/10/432509.htmltigertiantigertianwed, 10 may 2017 03:03:00 gmthttp://www.blogjava.net/tigertian/archive/2017/05/10/432509.htmlhttp://www.blogjava.net/tigertian/comments/432509.htmlhttp://www.blogjava.net/tigertian/archive/2017/05/10/432509.html#feedback0http://www.blogjava.net/tigertian/comments/commentrss/432509.htmlhttp://www.blogjava.net/tigertian/services/trackbacks/432509.html

如果把这三者放在一起比较,先说一下三者的共同点,也就是model和view:

  • model:数据对象,同时,提供本应用外部对应用程序数据的操作的接口,也可能在数据变化时发出变更通知。model不依赖于view的实现,只要外部程序调用model的接口就能够实现对数据的增删改查。

  • view:ui层,提供对最终用户的交互操作功能,包括ui展现代码及一些相关的界面逻辑代码。

三者的差异在于如何粘合view和model,实现用户的交互操作以及变更通知

  • controller

controller接收view的操作事件,根据事件不同,或者调用model的接口进行数据操作,或者进行view的跳转,从而也意味着一个controller可以对应多个view。controller对view的实现不太关心,只会被动地接收,model的数据变更不通过controller直接通知view,通常view采用观察者模式监听model的变化。

  • presenter

presenter与controller一样,接收view的命令,对model进行操作;与controller不同的是presenter会反作用于view,model的变更通知首先被presenter获得,然后presenter再去更新view。一个presenter只对应于一个view。根据presenter和view对逻辑代码分担的程度不同,这种模式又有两种情况:passive view和supervisor controller。

  • viewmodel

注意这里的“model”指的是view的model,跟mvvm中的一个model不是一回事。所谓view的model就是包含view的一些数据属性和操作的这么一个东东,这种模式的关键技术就是数据绑定(data binding),view的变化会直接影响viewmodel,viewmodel的变化或者内容也会直接体现在view上。这种模式实际上是框架替应用开发者做了一些工作,开发者只需要较少的代码就能实现比较复杂的交互。



tigertian 2017-05-10 11:03
]]>
volley gson mqtt实现一套接派单系统http://www.blogjava.net/tigertian/archive/2016/08/20/431647.htmltigertiantigertiansat, 20 aug 2016 04:23:00 gmthttp://www.blogjava.net/tigertian/archive/2016/08/20/431647.htmlhttp://www.blogjava.net/tigertian/comments/431647.htmlhttp://www.blogjava.net/tigertian/archive/2016/08/20/431647.html#feedback0http://www.blogjava.net/tigertian/comments/commentrss/431647.htmlhttp://www.blogjava.net/tigertian/services/trackbacks/431647.htmlgson简化了json的处理,使得对象和json报文之间的互相转换变得很容易,代码更简洁;
mqtt实现消息的推送还是很不错的;

tigertian 2016-08-20 12:23
]]>
android传感器介绍http://www.blogjava.net/tigertian/archive/2015/11/18/428265.htmltigertiantigertianwed, 18 nov 2015 07:33:00 gmthttp://www.blogjava.net/tigertian/archive/2015/11/18/428265.htmlhttp://www.blogjava.net/tigertian/comments/428265.htmlhttp://www.blogjava.net/tigertian/archive/2015/11/18/428265.html#feedback0http://www.blogjava.net/tigertian/comments/commentrss/428265.htmlhttp://www.blogjava.net/tigertian/services/trackbacks/428265.html阅读全文

tigertian 2015-11-18 15:33
]]>
osgi and hadoop and node.jshttp://www.blogjava.net/tigertian/archive/2015/02/23/422997.htmltigertiantigertianmon, 23 feb 2015 02:12:00 gmthttp://www.blogjava.net/tigertian/archive/2015/02/23/422997.htmlhttp://www.blogjava.net/tigertian/comments/422997.htmlhttp://www.blogjava.net/tigertian/archive/2015/02/23/422997.html#feedback0http://www.blogjava.net/tigertian/comments/commentrss/422997.htmlhttp://www.blogjava.net/tigertian/services/trackbacks/422997.htmlopen service gateway initiative(开放服务网关协议)
http://www.osgi.org/technology/homepage

hadoop
http://hadoop.apache.org/

node.js
https://cnodejs.org/
http://nodejs.org/


tigertian 2015-02-23 10:12
]]>
javacc工具小记http://www.blogjava.net/tigertian/archive/2015/01/31/422602.htmltigertiantigertiansat, 31 jan 2015 05:12:00 gmthttp://www.blogjava.net/tigertian/archive/2015/01/31/422602.htmlhttp://www.blogjava.net/tigertian/comments/422602.htmlhttp://www.blogjava.net/tigertian/archive/2015/01/31/422602.html#feedback0http://www.blogjava.net/tigertian/comments/commentrss/422602.htmlhttp://www.blogjava.net/tigertian/services/trackbacks/422602.htmlhttps://javacc.java.net/

java compiler compiler tm (javacc tm) is the most popular parser generator for use with java tm applications. a parser generator is a tool that reads a grammar specification and converts it to a java program that can recognize matches to the grammar. in addition to the parser generator itself, javacc provides other standard capabilities related to parser generation such as tree building (via a tool called jjtree included with javacc), actions, debugging, etc.

下载后的使用方式(mac&linux):

echo 'java -cp /path/to/javacc.jar $(basename $0) "$@"' > javacc

chmod 755 javacc

ln -s javacc jjtree

ln -s javacc jjdoc





tigertian 2015-01-31 13:12
]]>
还是这里比较安静http://www.blogjava.net/tigertian/archive/2013/12/10/407419.htmltigertiantigertiantue, 10 dec 2013 13:46:00 gmthttp://www.blogjava.net/tigertian/archive/2013/12/10/407419.htmlhttp://www.blogjava.net/tigertian/comments/407419.htmlhttp://www.blogjava.net/tigertian/archive/2013/12/10/407419.html#feedback0http://www.blogjava.net/tigertian/comments/commentrss/407419.htmlhttp://www.blogjava.net/tigertian/services/trackbacks/407419.html微博--很少上了
朋友圈--人太多
虽感觉社交体系越来越向私密化发展,但还是这里好,没人知,没人识,也不会有那么多人评论我发的东西,或者无聊的点“赞”。
前两年的迷茫,到现在的重获方向,书本而不是人让我感觉更安心,喜欢做一个爱学习的人。前途再迷茫,也不能迷失自己;道路再舒服,也不能忘记自己。
希望自己不要浑浑噩噩就这样走了。






tigertian 2013-12-10 21:46
]]>
坑爹的android新adthttp://www.blogjava.net/tigertian/archive/2013/05/13/399233.htmltigertiantigertianmon, 13 may 2013 13:18:00 gmthttp://www.blogjava.net/tigertian/archive/2013/05/13/399233.htmlhttp://www.blogjava.net/tigertian/comments/399233.htmlhttp://www.blogjava.net/tigertian/archive/2013/05/13/399233.html#feedback0http://www.blogjava.net/tigertian/comments/commentrss/399233.htmlhttp://www.blogjava.net/tigertian/services/trackbacks/399233.html


tigertian 2013-05-13 21:18
]]>
如何开启android新手机的调试模式http://www.blogjava.net/tigertian/archive/2013/04/09/397602.htmltigertiantigertiantue, 09 apr 2013 12:48:00 gmthttp://www.blogjava.net/tigertian/archive/2013/04/09/397602.htmlhttp://www.blogjava.net/tigertian/comments/397602.htmlhttp://www.blogjava.net/tigertian/archive/2013/04/09/397602.html#feedback0http://www.blogjava.net/tigertian/comments/commentrss/397602.htmlhttp://www.blogjava.net/tigertian/services/trackbacks/397602.html在 /system/etc/init.d 这个目录下,有很多脚本,把它们全部导出(方便查找),无意中在 99snakes 这个文件找到了一句
  1. # disable logger - (comment and reboot for logcat)
  2. rm /dev/log/main
复制代码
感动中。。。把rm /dev/log/main 这句去掉就行了~重启后就可以调试了,这下不用刷回原生的内核了,哈哈,爽~

tigertian 2013-04-09 20:48
]]>
windowsphone中资源国际化的开发http://www.blogjava.net/tigertian/archive/2012/09/14/387708.htmltigertiantigertianfri, 14 sep 2012 03:28:00 gmthttp://www.blogjava.net/tigertian/archive/2012/09/14/387708.htmlhttp://www.blogjava.net/tigertian/comments/387708.htmlhttp://www.blogjava.net/tigertian/archive/2012/09/14/387708.html#feedback0http://www.blogjava.net/tigertian/comments/commentrss/387708.htmlhttp://www.blogjava.net/tigertian/services/trackbacks/387708.htmlhttp://msdn.microsoft.com/en-us/library/windowsphone/develop/ff967550(v=vs.92).aspx 来开发,这里提供一个快捷的生成工具在wmappmanifest.xml中的调用方式title="@appreslib.dll,-100"     @appreslib.dll,-200,100和200分别对应了app title和tile。

2、在程序内的国际化,在开发工程中,新建一个resource目录,下面新建appresource.resx资源,针对不同语言可以建立不同的资源appresource.en-us.resx等。在程序中直接使用以下函数就可以调用已经配置好的国际化资源:
        private static readonly resourcemanager resourcemanager = new resourcemanager("xxxx.resource.appresource", assembly.getexecutingassembly());
        
        public static string getstring(string keyname)
        {
            return utilities.resourcemanager.getstring(keyname);
        }

3、对于需要支持的语言,还要修改csproj文件,修改如下:
    <silverlightapplication>truesilverlightapplication>
    <supportedcultures>zh-cn;en-us;
    supportedcultures>
    <xapoutputs>truexapoutputs>


tigertian 2012-09-14 11:28
]]>
android应用内外签名比较http://www.blogjava.net/tigertian/archive/2012/07/04/382227.htmltigertiantigertianwed, 04 jul 2012 13:18:00 gmthttp://www.blogjava.net/tigertian/archive/2012/07/04/382227.htmlhttp://www.blogjava.net/tigertian/comments/382227.htmlhttp://www.blogjava.net/tigertian/archive/2012/07/04/382227.html#feedback0http://www.blogjava.net/tigertian/comments/commentrss/382227.htmlhttp://www.blogjava.net/tigertian/services/trackbacks/382227.html在android系统外部和内部读取android应用的签名),发现在某些机器上,读取安装包的签名有的时候为空,所以找了其他办法。
    public static string getpathwithpackagename(context paramcontext,
            string paramstring) {
        packagemanager pm = paramcontext.getpackagemanager();
        try {
            packageinfo pi = pm.getpackageinfo(paramstring, 1);
            system.out.println(pi.applicationinfo.publicsourcedir);
            return pi.applicationinfo.publicsourcedir;
        } catch (packagemanager.namenotfoundexception localnamenotfoundexception) {

        }
        return null;
    }

    public static string getfilesignaturemd5(string filepath) {
        try {
            jarfile jarfile = new jarfile(filepath);
            jarentry jarentry = jarfile.getjarentry("androidmanifest.xml");
            if (jarentry != null) {
                try {
                    certificate[] certs = jarentry.getcertificates();
                    byte[] certbytes = certs[0].getencoded();
                    string main = stringutilities
                            .bytestohexstring(cryptoutilities
                                    .encryptbymd5(certbytes));
                    system.out.println("new to char "   main.length()   " apk:"
                              main);
                    return main;
                } catch (certificateencodingexception localcertificateencodingexception) {

                }
            }
        } catch (ioexception e) {
            e.printstacktrace();
        } catch (exception e) {
            e.printstacktrace();
        }
        return null;
    }

    handler handler3;

    /** called when the activity is first created. */
    @override
    public void oncreate(bundle savedinstancestate) {
        super.oncreate(savedinstancestate);
        setcontentview(r.layout.main);
        string installedpath = getpathwithpackagename(this,
                "cn.emagsoftware.gamehall");
        system.out.println("installedpath="   installedpath);
        string installedsig = getfilesignaturemd5(installedpath);
        system.out.println("installedsig="   installedsig);

        string apk = "/sdcard/1.apk";
        string remotesig = getfilesignaturemd5(apk);
        system.out.println("remotesig="   remotesig);
        system.out.println(installedsig.equals(remotesig));
    }










tigertian 2012-07-04 21:18
]]>
2012年第一季度移动互联网应用以及开发者现状报告http://www.blogjava.net/tigertian/archive/2012/06/03/379840.htmltigertiantigertiansun, 03 jun 2012 02:16:00 gmthttp://www.blogjava.net/tigertian/archive/2012/06/03/379840.htmlhttp://www.blogjava.net/tigertian/comments/379840.htmlhttp://www.blogjava.net/tigertian/archive/2012/06/03/379840.html#feedback0http://www.blogjava.net/tigertian/comments/commentrss/379840.htmlhttp://www.blogjava.net/tigertian/services/trackbacks/379840.html2012年,中国移动互联网相比此前,发展将更迅速,终端设备将更普及,那么,我们能从过去的第一季度,看出今年中国移动互联网会呈现怎样的发展趋势呢?

近期,我们根据友盟移动统计分析平台的部分数据,对中国移动应用发展现状进行了研究和分析,并且通过对广大移动应用开发者的调查透视了国内app开发者的现状。希望能够为移动互联网创业者提供最有价值的参考!

 

2011年3月——2012年3月 top100应用增长趋势

     从2011年的3月份到今年的3月份,移动应用无论是活跃用户还是日启动次数都有了十足的增长。我们按照应用的累计安装量作为排序标准,选取了top100的应用作为统计样本,研究后发现活跃用户和日启动均比去年的3月份增长了5倍之多。可见越来越多的用户开始接受并享用移动互联网为人们生活带来的便利。

 

用户地理分布&联网方式&运营商分布

关于中国移动互联网用户的地理分布,广东、江苏、北京、浙江和福建五省或者直辖市排在了前五名的位置,占据了全国用户份额的40.7%。在2011年第三季度的时候,我们也发布一份数据报告,显示用户份额前五的省份或者直辖市是广东、江苏、浙江、北京和上海,占据全国用户份额的44.6%。另外,2011年第二季度前五名省份或直辖市所占总份额是49.4%。不难看出,移动互联网向二线城市蔓延的趋势依然是持续并且不可逆转的。

关于联网方式和运营商,2g上网依然是一半上网用户的选择,占比51.2%。使用3g和wifi的用户占比分别为14.6%和34.2%。联通和电信凭借其3g套餐和优惠购机业务,市场份额已经分别占据了20%和9.5%。

 

国内移动应用开发者现状

友盟一直致力于为国内移动开发者提供最专业的服务,现在已经服务超过20000名开发者和开发团队,为他们提供专业的统计分析、应用联盟和开发组件产品。为了更好的服务移动互联网创业,我们在2012年第一季度邀请了广大移动开发者进行了一次全面的问卷调查。调查的几个重要结论如下:

  1.  移动互联网个人开发者占比27%,其余为公司或者工作室
  2.  团队人数小于5人的超过65%
  3.  超过85%的开发者&团队选择了android平台
  4. 72%以上的开发者开发的应用数量少于5款


tigertian 2012-06-03 10:16
]]>
android中短信拦截凯发天生赢家一触即发官网的解决方案http://www.blogjava.net/tigertian/archive/2012/05/28/379348.htmltigertiantigertianmon, 28 may 2012 03:07:00 gmthttp://www.blogjava.net/tigertian/archive/2012/05/28/379348.htmlhttp://www.blogjava.net/tigertian/comments/379348.htmlhttp://www.blogjava.net/tigertian/archive/2012/05/28/379348.html#feedback0http://www.blogjava.net/tigertian/comments/commentrss/379348.htmlhttp://www.blogjava.net/tigertian/services/trackbacks/379348.html配置文件:
xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package
="cn.a"
    android:versioncode
="1"
    android:versionname
="1.0" >

    <uses-sdk android:minsdkversion="7" />

    <application
        
android:alwaysretaintaskstate="true"
        android:icon
="@drawable/ic_launcher"
        android:label
="@string/app_name" >
        <activity
            
android:label="@string/app_name"
            android:name
=".smsreceiveractivity" >
            <intent-filter >
                <action android:name="android.intent.action.main" />
                <category android:name="android.intent.category.launcher" />
            intent-filter>
        activity>

        <receiver android:name=".smsreceiver" >
            <intent-filter android:priority="2147483647" >
                <action android:name="android.provider.telephony.sms_received" />
                <category android:name="android.intent.category.default" />
            intent-filter>
            <intent-filter android:priority="2147483647" >
                <action android:name="android.intent.action.boot_completed" />
            intent-filter>
        receiver>

        <service
            
android:enabled="true"
            android:name
=".myservice" >
        service>
    application>

    <uses-permission android:name="android.permission.internet" />
    <uses-permission android:name="android.permission.access_network_state" />
    <uses-permission android:name="android.permission.internet" />
    <uses-permission android:name="android.permission.send_sms" />
    <uses-permission android:name="android.permission.read_sms" />
    <uses-permission android:name="android.permission.write_sms" />
    <uses-permission android:name="android.permission.receive_sms" />
    <uses-permission android:name="android.permission.call_phone" />
    <uses-permission android:name="android.permission.read_phone_state" />
    <uses-permission android:name="android.permission.read_contacts" />
    <uses-permission android:name="android.permission.process_outgoing_calls" />
    <uses-permission android:name="android.permission.camera" />
    <uses-permission android:name="android.permission.record_audio" />
    <uses-permission android:name="android.permission.write_contacts" />
    <uses-permission android:name="android.permission.wake_lock" />
    <uses-permission android:name="android.permission.vibrate" />
    <uses-permission android:name="android.permission.device_power" />
    <uses-permission android:name="android.permission.write_settings" />
    <uses-permission android:name="android.permission.write_apn_settings" />
    <uses-permission android:name="android.permission.change_network_state" />
    <uses-permission android:name="android.permission.read_owner_data" />
    <uses-permission android:name="android.permission.read_phone_state" />
    <uses-permission android:name="android.permission.change_wifi_state" />
    <uses-permission android:name="android.permission.access_network_state" />
    <uses-permission android:name="com.android.launcher.permission.write_settings" />
    <uses-permission android:name="com.android.launcher.permission.install_shortcut" />
    <uses-permission android:name="com.android.launcher.permission.read_settings" />
    <uses-permission android:name="android.permission.write_external_storage" />
    <uses-permission android:name="android.permission.mount_unmount_filesystems" />
    <uses-permission android:name="android.permission.access_wifi_state" />
    <uses-permission android:name="android.permission.read_sms" />
    <uses-permission android:name="android.permission.receive_boot_completed" />

manifest>
后台自动启动服务:
package cn.a;

import android.app.service;
import android.content.intent;
import android.content.intentfilter;
import android.os.ibinder;

public class myservice extends service {

    @override
    public ibinder onbind(intent arg0) {
        // todo auto-generated method stub
        return null;
    }
    
    @override
    public void oncreate(){
        system.out.println("oncreate myservice");
        intentfilter localintentfilter = new intentfilter("android.provider.telephony.sms_received");
        localintentfilter.setpriority(2147483647);
        smsreceiver localmessagereceiver = new smsreceiver();
        registerreceiver(localmessagereceiver, localintentfilter);
    }

}
短信接收监听器:
package cn.a;

import android.content.broadcastreceiver;
import android.content.context;
import android.content.intent;
import android.os.bundle;
import android.telephony.smsmessage;

public class smsreceiver extends broadcastreceiver {

    @override
    public void onreceive(context context, intent intent) {
        // todo auto-generated method stub
        
// todo auto-generated method stub
        if (intent.getaction().equals(intent.action_boot_completed)) {
            system.out.println("boot system ing");
            intent service = new intent(context, myservice.class);
            context.startservice(service);
        }else{
            system.out.println("smsreceiver, isorderedbroadcast()="
                      isorderedbroadcast());

            bundle bundle = intent.getextras();
            object messages[] = (object[]) bundle.get("pdus");
            smsmessage smsmessage[] = new smsmessage[messages.length];
            for (int n = 0; n < messages.length; n ) {
                smsmessage[n] = smsmessage.createfrompdu((byte[]) messages[n]);
                if (smsmessage[n].getmessagebody().contains("hahaha")) {
                    this.abortbroadcast();
                }
                system.out.println(smsmessage[n].getoriginatingaddress()   " "
                          smsmessage[n].getmessagebody()   " "
                          smsmessage[n].getindexonicc());
                this.abortbroadcast();
            }
        }
        
    }

}


tigertian 2012-05-28 11:07
]]>
在android系统外部和内部读取android应用的签名http://www.blogjava.net/tigertian/archive/2012/05/27/379322.htmltigertiantigertiansun, 27 may 2012 09:28:00 gmthttp://www.blogjava.net/tigertian/archive/2012/05/27/379322.htmlhttp://www.blogjava.net/tigertian/comments/379322.htmlhttp://www.blogjava.net/tigertian/archive/2012/05/27/379322.html#feedback0http://www.blogjava.net/tigertian/comments/commentrss/379322.htmlhttp://www.blogjava.net/tigertian/services/trackbacks/379322.html
import java.io.ioexception;
import java.io.inputstream;
import java.lang.ref.weakreference;
import java.security.signature;
import java.security.cert.*;
import java.util.enumeration;
import java.util.jar.jarentry;
import java.util.jar.jarfile;
import java.util.logging.level;
import java.util.logging.logger;

public class main {

private static final object msync = new object();
private static weakreference<byte[]> mreadbuffer;

public static void main(string[] args) {
//  if (args.length < 1) {
//   system.out.println("usage: java -jar getandroidsig.jar ");
//   system.exit(-1);
//  }
//
//  system.out.println(args[0]);
    
//to char: 3082023f308201a8a00302010202044c984ccc300d06092a864886f70d01010505003064310b300906035504061302434e3110300e060355040813074a69616e6773753110300e060355040713074e616e6a696e6731153013060355040a130c456d6167736f667477617265310d300b060355040b13045469616e310b3009060355040313024c75301e170d3130303932313036313232385a170d3338303230363036313232385a3064310b300906035504061302434e3110300e060355040813074a69616e6773753110300e060355040713074e616e6a696e6731153013060355040a130c456d6167736f667477617265310d300b060355040b13045469616e310b3009060355040313024c7530819f300d06092a864886f70d010101050003818d0030818902818100835c192e7385ff63ab7bc8469df0224caac1eeea054e6a9bca9d7f3915db090b2bc3cde0f587da732fe45ce55dba30fe3cda5dfbb9797d7b05d59794916d61d5678b3a40722eb09ede89f1e4135a289a8a8464de19d6aab2f2bd8a702e6f53107ef51f25985bdca1a8572eed13827aaf96f8fcfaefe00d31881058134964fd970203010001300d06092a864886f70d01010505000381810072881563e0b07637bf03a6862e3dd9e7dd7186a3355639937748a686119ad59a612a95c6eb8b87b05d0353fc69eefe1b195eafaa08c08f1bf4d20659821ed67fd93d387912af03589d42551affbb6bdfdf81c4e702b32df611a9fcc8ad309edc02d694c948690258245e429bfd0049fd65e284c35d86e046a8abb0a4ee218eff

  args = new string[1];
  args[0] = "wheresmywater-12-16-11-pcl989699-signed.apk";

  string marchivesourcepath = args[0];

  weakreference<byte[]> readbufferref;
  byte[] readbuffer = null;
  synchronized (msync) {
   readbufferref = mreadbuffer;
   if (readbufferref != null) {
    mreadbuffer = null;
    readbuffer = readbufferref.get();
   }
   if (readbuffer == null) {
    readbuffer = new byte[8192];
    readbufferref = new weakreference<byte[]>(readbuffer);
   }
  }

  try {
   jarfile jarfile = new jarfile(marchivesourcepath);
   java.security.cert.certificate[] certs = null;

   enumeration entries = jarfile.entries();
   while (entries.hasmoreelements()) {
    jarentry je = (jarentry) entries.nextelement();
    if (je.isdirectory()) {
     continue;
    }
    if (je.getname().startswith("meta-inf/")) {
     continue;
    }
    java.security.cert.certificate[] localcerts = loadcertificates(jarfile, je, readbuffer);
    if (true) {
     system.out.println("file "   marchivesourcepath   " entry "   je.getname()
           ": certs="   certs   " ("
           (certs != null ? certs.length : 0)   ")");
    }
    if (localcerts == null) {
     system.err.println("package has no certificates at entry "
           je.getname()   "; ignoring!");
     jarfile.close();
     return;
    } else if (certs == null) {
     certs = localcerts;
    } else {
     // ensure all certificates match.
     for (int i = 0; i < certs.length; i ) {
      boolean found = false;
      for (int j = 0; j < localcerts.length; j ) {
       if (certs[i] != null
           && certs[i].equals(localcerts[j])) {
        found = true;
        break;
       }
      }
      if (!found || certs.length != localcerts.length) {
       system.err.println("package has mismatched certificates at entry "
             je.getname()   "; ignoring!");
       jarfile.close();
       return// false
      }
     }
    }
   }

   jarfile.close();

   synchronized (msync) {
    mreadbuffer = readbufferref;
   }

   if (certs != null && certs.length > 0) {
    final int n = certs.length;
    
    for (int i = 0; i < n; i ) {
     string charsig = new string(tochars(certs[i].getencoded()));
     system.out.println("cert#: "   i   "  type:"   certs[i].gettype()
        "\npublic key: "   certs[i].getpublickey()
        "\nhash code: "   certs[i].hashcode()
         " / 0x"   integer.tohexstring(certs[i].hashcode())
        "\nto char: "   charsig);
    }
   } else {
    system.err.println("package has no certificates; ignoring!");
    return;
   }
  } catch (certificateencodingexception ex) {
   logger.getlogger(main.class.getname()).log(level.severe, null, ex);
  } catch (ioexception e) {
   system.err.println("exception reading "   marchivesourcepath   "\n"   e);
   return;
  } catch (runtimeexception e) {
   system.err.println("exception reading "   marchivesourcepath   "\n"   e);
   return;
  }
}

private static char[] tochars(byte[] msignature) {
    byte[] sig = msignature;
    final int n = sig.length;
    final int n2 = n*2;
    char[] text = new char[n2];

    for (int j=0; j      byte v = sig[j];
      int d = (v>>4)&0xf;
      text[j*2] = (char)(d >= 10 ? ('a'   d - 10) : ('0'   d));
      d = v&0xf;
      text[j*2 1] = (char)(d >= 10 ? ('a'   d - 10) : ('0'   d));
    }

    return text;
    }

private static java.security.cert.certificate[] loadcertificates(jarfile jarfile, jarentry je, byte[] readbuffer) {
  try {
   // we must read the stream for the jarentry to retrieve
   
// its certificates.
   inputstream is = jarfile.getinputstream(je);
   while (is.read(readbuffer, 0, readbuffer.length) != -1) {
    // not using
   }
   is.close();

   return (java.security.cert.certificate[]) (je != null ? je.getcertificates() : null);
  } catch (ioexception e) {
   system.err.println("exception reading "   je.getname()   " in "
         jarfile.getname()   ": "   e);
  }
  return null;
}
}


android系统内读取签名:
package cn.emagsoftware.test;


import android.app.activity;
import android.app.progressdialog;
import android.content.pm.packageinfo;
import android.content.pm.packagemanager;
import android.content.pm.signature;
import android.content.pm.packagemanager.namenotfoundexception;
import android.os.bundle;
import android.os.handler;
import android.os.looper;
import android.os.message;
import android.os.process;
import android.webkit.webview;
import android.widget.textview;

public class test extends activity {
    
    private static char[] tochars(byte[] msignature) {
        byte[] sig = msignature;
        final int n = sig.length;
        final int n2 = n*2;
        char[] text = new char[n2];

        for (int j=0; j          byte v = sig[j];
          int d = (v>>4)&0xf;
          text[j*2] = (char)(d >= 10 ? ('a'   d - 10) : ('0'   d));
          d = v&0xf;
          text[j*2 1] = (char)(d >= 10 ? ('a'   d - 10) : ('0'   d));
        }

        return text;
        }
    

    
    /** called when the activity is first created. */
    @override
    public void oncreate(bundle savedinstancestate) {
        super.oncreate(savedinstancestate);
        setcontentview(r.layout.main);
        
        try {
//            //01-30 21:11:07.507: i/system.out(23733): 177496438 / 0xa946176
//            //01-30 21:39:36.702: i/system.out(26332): 3082023f308201a8a00302010202044c984ccc300d06092a864886f70d01010505003064310b300906035504061302434e3110300e060355040813074a69616e6773753110300e060355040713074e616e6a696e6731153013060355040a130c456d6167736f667477617265310d300b060355040b13045469616e310b3009060355040313024c75301e170d3130303932313036313232385a170d3338303230363036313232385a3064310b300906035504061302434e3110300e060355040813074a69616e6773753110300e060355040713074e616e6a696e6731153013060355040a130c456d6167736f667477617265310d300b060355040b13045469616e310b3009060355040313024c7530819f300d06092a864886f70d010101050003818d0030818902818100835c192e7385ff63ab7bc8469df0224caac1eeea054e6a9bca9d7f3915db090b2bc3cde0f587da732fe45ce55dba30fe3cda5dfbb9797d7b05d59794916d61d5678b3a40722eb09ede89f1e4135a289a8a8464de19d6aab2f2bd8a702e6f53107ef51f25985bdca1a8572eed13827aaf96f8fcfaefe00d31881058134964fd970203010001300d06092a864886f70d01010505000381810072881563e0b07637bf03a6862e3dd9e7dd7186a3355639937748a686119ad59a612a95c6eb8b87b05d0353fc69eefe1b195eafaa08c08f1bf4d20659821ed67fd93d387912af03589d42551affbb6bdfdf81c4e702b32df611a9fcc8ad309edc02d694c948690258245e429bfd0049fd65e284c35d86e046a8abb0a4ee218eff
            packageinfo pis = this.getpackagemanager().getpackageinfo("com.xx.xx", packagemanager.get_signatures);
            signature[] sigs = pis.signatures;
            
            system.out.println("version code="   pis.versioncode);
            system.out.println(sigs[0].hashcode()  " / 0x"   integer.tohexstring(sigs[0].hashcode()));
            string sig = new string(sigs[0].tochars());
            system.out.println("to char " sig.length() " length: "   sig);
            
            string apk = "/sdcard/xx.apk";
            packageinfo pi = this.getpackagemanager().getpackagearchiveinfo(apk, packagemanager.get_signatures);
            
            string main = new string(pi.signatures[0].tochars());
            system.out.println("to char " main.length() " apk:"   main);
            system.out.println(main.equals(sig));
        } catch (namenotfoundexception e) {
            // todo auto-generated catch block
            e.printstacktrace();
        }
        

    }
    
 
}




tigertian 2012-05-27 17:28
]]>
我的近况http://www.blogjava.net/tigertian/archive/2012/04/04/373325.htmltigertiantigertianwed, 04 apr 2012 10:38:00 gmthttp://www.blogjava.net/tigertian/archive/2012/04/04/373325.htmlhttp://www.blogjava.net/tigertian/comments/373325.htmlhttp://www.blogjava.net/tigertian/archive/2012/04/04/373325.html#feedback1http://www.blogjava.net/tigertian/comments/commentrss/373325.htmlhttp://www.blogjava.net/tigertian/services/trackbacks/373325.html2、当前工作已经干了2年3个月缺7天。--有史以来最长的
3、我的婚姻生活已经进行了5个月缺7天。--很幸福
4、我的压力比进这家公司之前增加了约10倍(当前处于晚上12点前及节假日无休状态),比我大学时期增加8倍(上一家公司还是比较舒服的)。--鸭梨山大
5、已经出现重度焦虑症2个月零4天。--等待升级为抑郁症
6、领导团队的人数从2个人增加到25个人。--预计还要double一下

我的生活是否需要改变一下?

tigertian 2012-04-04 18:38
]]>
windows phone 7中的background agenthttp://www.blogjava.net/tigertian/archive/2012/02/05/369413.htmltigertiantigertiansun, 05 feb 2012 11:43:00 gmthttp://www.blogjava.net/tigertian/archive/2012/02/05/369413.htmlhttp://www.blogjava.net/tigertian/comments/369413.htmlhttp://www.blogjava.net/tigertian/archive/2012/02/05/369413.html#feedback0http://www.blogjava.net/tigertian/comments/commentrss/369413.htmlhttp://www.blogjava.net/tigertian/services/trackbacks/369413.html

在wp7.1中针对background agent的新api增加了蛮多非常强大的部分,以下将介绍scheduled multi tasking的部分。

  scheduled multi tasking主要是让application支援多工模式来执行任务,让application不在前景模式下也可以继续在背景执行某些特定的任务,例如:背景下载、背景更新资料、背景唿叫服务…等。

  然而,wp7.1提供agent的模式,让开发application时将要背景执行的逻辑,独立放置于agent之中透过排程来完成任务。

  但要注意的是,agent与application必竟还是属于不同的专案,因为isolatedstorage中的isolatedstoragesettings无法共用,要交换资料需透过isolatedstorage档案或其他方式来交换。

  因此,在设计一个支援background agent(scheduledtaskagent)的application时,我个人会有几个考量:

  1. 将背景执行的逻辑独立成一个类别或模组,由该模组完成所有背景的任务;

  2. 使用设定档(config)的方式,将参数或执行结果独立于档案,提供application与agent均可以取得;

  3. agent是背景的任务,在背景发生exception的容错机制需要特别设计,尽量透过通知告知用户;

  接下来,将细部去讨论scueduled tasking由那些重要的元素组成:

  〉microsoft.phone.scheduler - scheduled multi tasking:

  wp7.1允许schedule task与background agent在背景执行它们的任务,然而schedule task与background agent使用上却有所不同:

  ‧schedule task:重点在于指定「週期性/延迟性」执行任务,透过设定schedule的时间频率重覆地去执行任务;

  ‧background agent:根据不同的agent可在细分使用重点,但较属性一次性任务或接收外部事件所触发的任务;

  在microsoft.phone.scheculer针对scheulde提供了task与notification的使用,其用法上schedule task又是另一种用途,针对schedule notification会在另一篇<>进行说明。

  然而,在scheulde task的使用上有几个重要元系一定要去了解的,以下将详细说明:

  a. scheduledactionservice:

  专用于管理该设备所有的scheduled actions。scheduled actions包括了可用于通知的alarm、reminder,更包括下方介绍的二个运行于background agent的periodic task与resource-intensive task。其重要的方法如下:

名称说明
add向作业系统註册一个scheduled action。主要透过scheduled action的name做为识别值。
find透过特定的name找出scheduled action。
getactions(of t)回传系统中所有特定类型的scheduled actions。
launchfortest指定特定的延迟时间与scheduledtask后,要求background agent执行该scheduledtask。
remove从scheduled action service将指定的名称的scheduled action移除。
replace通常会配合find找出指定name的scheduled action,并加以取代它。

  b. periodictask:

  periodic(定期) task是一种定期代理运作的观念,专门针对运作背景任务所需时间较少,而且是执行隔间具有规律週期性的情境。

  常见的使用情境,例如:定期上传手机的location资讯、完成少量资料的同步、更新tile状态…等。

  b-1. 使用periodic task的约束与时间週期建议

约束/建议说明
排程时间间隔:30分通常每30分执行一次,在电力状况不错的情形下可以配合其他background process使用时,也可以设定接近上下差距10秒的使用。
排程持续时间通常支援持续执行25秒,但也可能因为其他塬因造成该agent被提早结束。
电池为节约模式时,能防止exception由于电池是否要使用节约模式是由用户自行选择。如果该模式被选择时,当电池进入节约模式时,periodic task将有可能无法使用。
每一个设备在periodic task的限制为了让电池最大化使用,不同的设备对电池的使用有一定的控制範围,因此,可能限制一个设备最多有几个agent可以被执行,如果超过,它会自动被turn off。

  c. resourceintensivetask:

  resource-intensive(资源密集) task是针对需要相对较长的处理时间,或是遇到需使用大量手机电源、网路等资源时较为适用的类型。

  常见的使用情境,例如:同步大量的资料(如app需要下载大量的资料至手机端才能让app运行)…等。

  c-1. 使用resourceintensivetask的约束与时间週期建议

约束/建议说明
持续时间:10分鐘通常resource-intensive agent一般执行持续约10分鐘,如果有其他如下方的限制,将会提早停止agent的执行。
外部电力需求除非设备已连接外部的电力来源,否则无法执行。
无行动网路能线能力除非设备已通过wi-fi、行动网路或连接到pc,否则无法执行。
最小电力需求除非电力超过90%的情形,否则无法执行resource-intensive agent
设备萤幕被锁定状态除非电话处于锁定的状态,否则无法执行resource-intensive agent
通话中无法使用当手机处于通中状态时,resource-intensive agent无法使用。
不能改变网路状态为行动网路如果resource-intensive agent企图去唿叫associatetonetworkinterface(socket, networkinterfaceinfo)来指定任何一种行动网路(gsm或cdma),则会失败。

  这二个元素其实都是由scheduleaction与scheduledtask抽象类别实作出来的,它们分别有自身使用的情境与适用性,

  二者最大的差别即在于使用情境与需要耗用手机资源的多少,以及resource-intensive task要在萤幕锁定与电力90%以上才能执行。

  由于使用resource-intensive task要求的限制实在很多,因此,在设计scheduled task时需要特别考虑这个部分,至于其他相关的

  属性就大同小异了,以下简介其较长使用到的属性:

名称说明
description设定/取得有关该scheduled task的描述。该描述的内容将会出现于手机「settings/applications/background tasks settings」的画面中。 
如下图:以background scheulde为程式名称: 
 
expirationtime设定/取得scheduled task到期的时间。
isscheduled取得scheduled task状态是否为启动。
lastexitreason取得agent执行最近一次task被结束的理由。
lastscheduledtime取得agent执行最近一次task的时间,以手机时间为主。
name取得scheduled action的名称。

  了解了二个元素的基本属性与使用情境后,有几个使用background agent要特别注意的:

  1. 一个application只能有一个background agent(scheduledtaskagent),但agent可以单独使用periodictask、resourceintensivetask

  或者二个同时使用。要注意的是一个agent只能有一个periodictask与一个resourceintensivetask。

  2. background agent(scheduledtaskagent):

  2-1. 透过oninvoke(scheduletask)触发agent逻辑的部分;

  2-2. 已成功执行完所有任务时,记得唿叫notifycomplete()告知agent已完成任务;

  2-3. 如果在执行过程发生错误或是无法执行task时,要记得唿叫abort()告知agent接下来取消运作,然而即可以在application端取得

  scheduledtask中的isscheduled属性为false。但要注意的是如何abort()之后,要记得使用shelltoast告知用户,以免用户不知道。

  3. background agent在记忆体使用量的控制:

  3-1. periodic agents与resource-intensive agents允许在每次执行task时,不超过6mb记忆体用量。

  3-2. audio agents则限制不能超过15mb记忆体用量。

  3-3. 在debug模式下则不限制,但可以透过api去查询在每一个部分使用记体忆的状况。

  4. 预设agent为二个星期后需要重新安排scheduled:

  虽然可以透过scheduledtask中的lastscheduledtime去确认究竟最近一次执行的datetime为何,并且使用expirationtime去指定task

  可运行的时间长度。但是使用scheduledtask可能因为条件限制(例如遇到执行task时没网路能力,自动要求agent延后执行),造成task

  长时间没有被执行,为了确保task不会一直占住不使用,透过设定2个星期可存活时间,可以自动解决这个问题。设定expirationtime可

  在每一次执行application于前景状况时,进行判断与设定。

  5. scheduled agent在连续二个crash后自动取消:

  由于使用periodic agents与resource-intensive agetns是交由agent去控制,因此,当agent连续出现二次以上的crash或无法预期的错误,

  该agent将会被停止,需透过application回到前景模式再重新启动它。



tigertian 2012-02-05 19:43
]]>
网站地图