2017-07-20 14:12:03 |  0 Comments  |  Android

Service的使用

Service是Android的四大组件之一,它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务。必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持运行状态。


Service的基本用法

关于Service最基本的用法自然就是如何启动一个Service了,启动Service的方法和启动Activity很类似,都需要借助Intent来实现,下面我们就通过一个具体的例子来看一下。
新建一个Android项目,项目名就叫ServiceTest,这里我选择使用4.0的API。

然后新建一个MyService继承自Service,并重写父类的onCreate()、onStartCommand()和onDestroy()方法,如下所示:

  1. public class MyService extends Service {
  2. public static final String TAG = "MyService";
  3. @Override
  4. public void onCreate() {
  5. super.onCreate();
  6. Log.d(TAG, "onCreate() executed");
  7. }
  8. @Override
  9. public int onStartCommand(Intent intent, int flags, int startId) {
  10. Log.d(TAG, "onStartCommand() executed");
  11. return super.onStartCommand(intent, flags, startId);
  12. }
  13. @Override
  14. public void onDestroy() {
  15. super.onDestroy();
  16. Log.d(TAG, "onDestroy() executed");
  17. }
  18. @Override
  19. public IBinder onBind(Intent
 2017-07-19 15:42:11 |  0 Comments  |  Android

LayoutInflater使用

android编码中常常会使用到需要动态的加载View的情况,这时候我们就需要使用到LayoutInflate。

基本用法

首先先实例化一个LayoutInflater,有两种写法:

  1. LayoutInflater layoutInflater = LayoutInflater.from(context);
  2. LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

明显第一种是第二种的简化版,android给我们加了一些封装。
接下来调用实例化来的LayoutInflater的inflate()方法:

  1. layoutInflater.inflate(resourceId,root);

inflate()方法一般接收两个参数,第一个是要加载的布局id,第二个是指给该布局的外部再嵌套一层父布局,如果不需要就直接传null。这样就成功成功创建了一个布局的实例,之后再将它添加到指定的位置就可以显示出来了。

举个例子吧,我们先创建个原始的布局文件,MainActivity对应的activity_main.xml:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:id="@+id/main_layout"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. </LinearLayout>

然后再建一个button_activity.xml:

  1. <Button xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="wrap_content"
  3. android:layout_height="wrap_content"
 2017-06-27 11:19:08 |  0 Comments

常用语句入门

SQLite是安卓中用到的主要存储方式,这里整理一些常用的语句,供日后查询。

 

1. sqlite数据库数据类型

Interger
varchar(10)
float
double
char(10)
text

2. sql常用语句

2.1创建表的语句

create table 表名 (字段名称 数据类型 约束,字段名称 数据类型 约束...)
eg. create table person(_id Interger primary key,name varchar(20), age Integer not null)

                2.2 删除表的语句

drop table 表名
eg. drop table person

                2.3 插入语句

insert into 表名[字段,字段] values(值1,值2...)
insert into person(_id,age) values(1,20)
insert into person values(2,"zs",30)

                注:values后的值的类型应和person后的字段对应

 

                2.4 修改数据

update 表名 set 字段=新值 where 修改的条件
eg. update person set name="ls",age=20 where _id=1

            

                2.5 删除数据

delete from 表名 where 删除的条件
eg. delete from person where _id=2


                2.6 查询数据

select 字段名 from 表名 where 查询条件 group by 分组字段 having 筛选条件 order by 排序字段
select * from person;                       //查询表中所有字段
select _id,name from person                 //查询表中所有_id与name字段数据
select * from person where _id=1            //查询表中_id等于1的数据
select * from person 
 2017-06-01 14:55:33 |  0 Comments

基础知识点一 js中Map和Set的使用

Map使用:

直接初始化一个空的Map,用以下方法:

var m = new Map(); // 空Map
m.set('Adam', 67); // 添加新的key-value
m.set('Bob', 59);
m.has('Adam'); // 是否存在key 'Adam': true
m.get('Adam'); // 67
m.delete('Adam'); // 删除key 'Adam'
m.get('Adam'); // undefined​​​

注:一个key只能对应一个value,所以后放进key的value会冲掉之前放进的值。


Set使用:

SetMap类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。

要创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set

var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3]); // 含1, 2, 3

重复元素在Set中自动被过滤:

var s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"}

注意数字3和字符串'3'是不同的元素。

通过add(key)方法可以添加元素到Set中,可以重复添加,但不会有效果:

>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.add(4)
>>> s
{1, 2, 3, 4}

通过delete(key)方法可以删除元素

var s = new Set([1, 2, 3]);
s; // Set {1, 2, 3}
s.delete(3);
s; // Set {1, 2}​
 ​


参考自js教程

 2017-04-19 10:59:44 |  0 Comments  |  method

递归算法

        通常,在遍历多重数据的时候,如果继续使用for循环,会显得代码庸众,代码效率不高,容易有重复遍历的可能,当数据量大的时候,这种方法就不可取了,随后想到之前学c时接触到的一个算法,递归算法,既能满足代码运行效率高的要求,代码看起来比较简洁。

        我要实现的功能其实不难,查找数据库中数据,根据每条的父id查找到同一父id下的其他同级数据,同一父id的做排序,同时,本条数据的id也可能是另一条的父id,一番绞尽脑汁之后,眼前一亮,思如泉涌...

        /// <summary>
        /// 根据ParentId将表中ArgenCode排序
        /// </summary>
        public void caulateRank()
        {
            RankArgen(0, argenAdo.GetArgenByParentId(0));
        }
        
        private void RankArgen(int id, List<Argen> SameParentList)
        {
            if (SameParentList[id].ParentArgen != 0)
            {
                //不为最高级
                Argen ParentArgen = argenAdo.GetArgenByArgenId(SameParentList[id].ParentArgen);
                string ParentCode = ParentArgen.ArgenCode;
                SameParentList[id].ArgenCode = ParentCode + (id + 1).ToString().PadLeft(ParentCode.Length, '0');
                argenAdo.ModifyArgen(SameParentList[id]);
                List<Argen> ChildList = argenAdo.GetArgenByParentId
 2017-04-19 10:59:44 |  2 Comments  |  method

关于守护进程算法

在最近项目中,主程序会因各种问题退出,为了防止这一现象出现,特地研究守护进程的实现,来守护主程序,守护进程的实现思路主要有两种:

1.守护进程对注册表中特定项值做递减,当值为0时系统重启,主程序中启动守护,并对注册标表中的特定项值赋初值切做递加,当主程序运行过程中,守护进程不会讲项值减到0,达到守护主进程的效果。

2.守护进程查找进程列表中是否有主进程,若没有则重启操作系统。

目前设置了主程序的开机自启动,所以重启操作系统就可以了。

方法一:

    public class RegistryEudemon
    {
        private RegistryHelper regHelper;
         private string baseSubKey = @"SOFTWARE\\";

        public RegistryEudemon()
        {
            regHelper = new RegistryHelper(baseSubKey, RegDomain.LocalMachine);
            //生成Eudemon项
            string subKey = regHelper.PathAdd(baseSubKey, @"\Eudemon");
            if (!regHelper.IsSubKeyExist(subKey))
            {
                regHelper.CreateSubKey(subKey);
            }
            regHelper.SubKey = subKey;
        }

        public void UpdateCount(int value)
        {
            regHelper.WriteRegeditKey(regHelper.PathAdd(baseSubKey, @"\Eudemon"), "count", value);
        }

        public int SubtractCount()
        {
            int cnt = int.Parse(regHelper.R
 2016-10-13 14:22:13 |  2 Comments

关于编译链接的详解

        平常工作中经常会看到程序包里有.lib、.obj、.dll等文件,只是大概知道他们的作用,却没有深入了解,不知道他们是怎么来的,具体有什么用,知道今天了解makefile的时候才对这个有进一步的认识。

        一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执

行文件,这个动作叫作链接(link)。   
     
       编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可

以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。 
       链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时

候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是

.lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

      总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而

在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定

函数的ObjectFile.

 2016-10-13 11:26:59 |  2 Comments

eclipse中NDK环境的配置与JNI编写驱动入门

        使用c/c++编写底层代码可以提高效率,基于这个原因,决定使用JNI的方式编写安卓底层驱动的代码。

        要进行jni的编写,就必须在eclipse下配置ndk,谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK。而在NDKr7开始,Google的

Windows版的NDK提供了一个ndk-build.cmd的脚本,这样,就可以直接利用这个脚本编译,而不需要使用Cygwin了。只需要为Eclipse Android工程添加一个Builders,而为Eclipse配置的builder,其实就是在执行

Cygwin,然后传递ndk-build作为参数,这样就能让Eclipse自动编译NDK了。

        我下的是目前最新的NDK版本,所以就不需要用到Cygwin,下好ndk后就可以开始配置了,配置完成后就可以开始jni的编写,编写的主要的流程是:

        1.先在java里声明要调用c的库和库函数;

        2.通过java命令生成.h文件;

        3.实现对应的c文件,c源码中实现库函数;

        4.自己编写Android.mk文件(makefile);

        5.保存更新,自动生成.so的库;

        6.java代码中调用;

    出自:  http://www.cnblogs.com/yejiurui/p/3476565.html

        

 2016-09-08 14:48:53 |  0 Comments

关于java与c# 3des加解密的区别

主要差异如下:

1、  对于待加密解密的数据,各自的填充模式不一样

      C#的模式有:ANSIX923、ISO10126、None、PKCS7、Zero,而Java有:NoPadding、PKCS5Padding、SSL3Padding

2、  各自默认的3DES实现,模式和填充方式不一样

C#的默认模式为CBC,默认填充方式为PKCS7; java的默认模式为ECB,默认填充方式为PKCS5Padding

3、  各自的key的size不一样

C#中key的size为16和24均可;java中要求key的size必须为24;对于CBC模式下的向量iv的size两者均要求必须为8

 

翻看了3DES的原理:

DES主要采用替换和移位的方法,用56位密钥对64位二进制数据块进行加密,每次加密可对64位的输入数据进行16轮编码,

经一系列替换和移位后,输入的64位转换成安全不同的64的输出数据

.   
3DES:是在DES的基础上采用三重DES,即用两个56位的密钥K1,K2,发送方用K1加密,K2解密,再使用K1加密.接收方使用K1解密,K2加密,再使用K1解密,

其效果相当于密钥长度加倍.

 

于是尝试在java中,对key进行补位,即用前8个字节作为byte[24] 中的byte[16]~byte[23];发现与c#中加密的结果相同!于是大胆假设C#中可能是检查key的size为16的时候

自动将前8个字节作为k3进行了补位,而java没有实现这一点(因为java的3DES算法中强制要求key的size必须为24)。这样的情况下,可能就是发送方用k1加密、k2解密、k3再加密;接受方k3解密、k2加密、再k1解密来实现。

 

最终经过编码验证,确认key大小为24时,java和c#的加密解密结果相一致。

Java中实现时,只要注意对大小不足24的key进行补位,和采用CBC模式,填充模式为PKCS5Padding即可。


在项目中发现用3des加密后传输到银行的数据解包不出的情况,通过对比,得知银行端使用java默认填充方式,故我这边c#端相应改变,下面具体介绍下pkcs7和pkcs5的填充方式:

PKCS #7 填充字符串由一个字节序列组成,每个字节填充该填充字节序列的长度。

假定块长度为 8,数据长度为 9,
数据: FF FF FF FF FF FF FF FF FF
PKCS7 填充: FF F

 2016-08-30 13:44:06 |  0 Comments

关于“jQuery未定义”错误解决方法

在正确加载本地js文件后,调试网页仍然报错,提示“jQuery未定义”,检查语法没错的前提下找到一篇博客,上面提到“前后顺序规则”,原来的代码如下图:

基于这一规则,我把这两句换了个位置,记过就过了,由上,可知,有些语言对于语句的前后顺序是很严谨的!

Title - Artist
0:00