10月 272016
 

使用gson进行数据解析后,必须在混淆脚本中添加如下代码,如果不加的话json解析就会失败。

其中-keep class com.bcoder.test.datatypes.** { *; }这一行class和.**之间改成你的Bean类所在的包名

10月 272016
 

  我们知道,当app的屏幕进行旋转或者其他的配置变化的时候,Fragment会执行它的周期变化,重新创建Fragment并加载(除非设置了setRetainInstance(true)),那么在重建的时候Fragment中的变量就会被重新初始化,运行中的状态将无法保留。

  setArgument中的Bundle可以用来存放各种需要保持的数据,即使Fragment由于配置改变而重建,这些保存的数据也不会被清除。

  下面我们将通过一个实例来测试一下,在实例的Fragment中共有3个TextView和一个Button,为了使测试的内容更清晰,下面把三个TextView对应的字符串列表如下:

textview1->banana,   textview2->apple,   textview3->pear

  对应的三个字符串:

  • mParam1: 在Fragment.newInstance中传入,并保存在setArgument中,但是在点击按钮时未更新到Argument中
  • mParam2: Fragment中的私有变量,和Argument无任何交互
  • mParam3: 在Fragment.newInstance中传入,并保存在setArgument中,并且在点击按钮时更新到了Argument中

  测试程序的布局代码和java代码如下:

  Fragment部局文件的代码

  Fragment的Java代码

  主Activity的代码

  主Activity的布局文件代码

  程序启动时显示默认如下内容:

  textview1和textview3的值取自getArgument并显示在了屏幕上,当点击按钮时会重新给三个String变量赋值,并显示到textview中,如下图:

  这时三个字符串变量都有了新的值,那么当我们把屏幕进行一下旋转操作后,看结果如何呢?

  由图可知,字符串1回到了最初的状态(创建Fragment时传入的值),而字符串2被清除了。

  字符串3因为在点击按钮的时候重新被保存在getArgument中,而没有任何的变化的被保留下来了。

  因此大家在给Fragment传入参数的时候最好通过setArgument进行保存,而不是简单的通过一个变量进行保存。

注意:

  1. setArgument只能在Fragment中创建后(MyFragment fragment = new MyFragment())立即调用,如果在Fragment被附加到Activity中后再调用就会报错,可以在按钮的点击事件中添加一下setArgument的调用进行一下试验,应用将被异常终止。
8月 292016
 

直接上代码

Calendar calendar = Calendar.getInstance();

//显示当前时间
System.out.println(calendar.getTime());

//各种日期格式化
SimpleDateFormat format = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss.SSS”);

String str = format.format(calendar.getTime());
System.out.println(str);

format = new SimpleDateFormat(“yyyyMMdd”);
str = format.format(calendar.getTime());
System.out.println(str);

format = new SimpleDateFormat(“yyyy/MM/dd”);
str = format.format(calendar.getTime());
System.out.println(str);

format = new SimpleDateFormat(“yyyy/M/d”);
str = format.format(calendar.getTime());
System.out.println(str);

//获取时间戳
str = String.valueOf(calendar.getTimeInMillis());
System.out.println(“时间戳: ” + str);

//减去一天
calendar.add(Calendar.DAY_OF_YEAR, -1);
format = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss.SSS”);
str = format.format(calendar.getTime());
System.out.println(str);

//减去一个月
calendar = Calendar.getInstance();
calendar.add(Calendar.MONTH, -1);
format = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss.SSS”);
str = format.format(calendar.getTime());
System.out.println(str);

//减去一年
calendar = Calendar.getInstance();
calendar.add(Calendar.YEAR, -1);
format = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss.SSS”);
str = format.format(calendar.getTime());
System.out.println(str);

//只获取日期,不包含时间
calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
format = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss.SSS”);
str = format.format(calendar.getTime());
System.out.println(str);

//获取本月的第一天
calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, 1);
format = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss.SSS”);
str = format.format(calendar.getTime());
System.out.println(str);

//时间戳字符串转日期时间
calendar = Calendar.getInstance();
str = String.valueOf((calendar.getTimeInMillis() – 60 * 1000) ); //减去一分钟
calendar.setTimeInMillis(Long.parseLong(str));
format = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss.SSS”);
str = format.format(calendar.getTime());
System.out.println(str);

 Posted by on 2016-08-29
8月 162016
 

  要给app做一个定时提醒的功能,使用到了AlarmManager,因为涉及到很多天以后的提醒,所以不好测试,但是通过adb是可以查看系统已保存的AlarmManager 的,具体命令如下:

  如果我们只想看我们自己的应用的情况,则用linux的过滤器也可以(MAC下使用未在Windows下测试),命令如下:

 

8月 052016
 

1、运行时授权

  6.0以后用户可以运行时对应用进行授权管理,当你的应用需要使用某个权限时可以用checkSelfPermission()检查是否拥有某个权限,如果没有这个权限的话使用requestPermissions()来申请权限。

2、磕睡模式和应用空闲状态的优化

  此特性是为了更好的节省系统用电量。

3、除去Appche Http Client的支持

  如果你原来使用了这个Client,并且你的目标系统在Android2.3(Api Level9)以上,那么你现在可以使用HttpURLConnection代码Apache http client,这个api的流压缩和响应缓存可以提高网络访问的效率,并降低电量的耗损。如果你还想继续使用Apache http client,那么你可以在build.gradle中加入以下代码

4、BoringSSL

  使用BoringSSl代替原来的OpenSSL,使用NDK的需要注意,具体查一下官网的介绍。

5、硬件标识访问

  为了更好的保护用户的数据,此版本不再支持程序获取设备的本地Wifi和蓝牙的硬件标识,WifiInfo.getMACAddress()和BluetoothAdapter.getAddress()方法将始终返回值为02:00:00:00:00:00

如果要通过蓝牙或者Wifi扫描获取附近的外部设备的硬件标识,你的应用必须定义ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION权限。

6、通知Notifications

  不在支持方法Notification.setLatestEventInfo(),使用Notification.Builder类代替来创建notifications。如果要多次更新notification,定义一个全局的Notification.Builder实例并在这个对象内更新,最后使用build()方法获取更新后的notification对象。

7、AudioManager的改变

  不再支持直接通过AudioManager类设置音量和静音指定的音频流。setStreamSolo()方法不再推荐使用,你可以通过requestAudioFocus()方法代替。setStreamMute()也不再推荐使用,你可以使用adjustStreamVolume()方法和参数ADJUST_MUTE or ADJUST_UNMUTE代替该方法。

8、文本的选择操作

  在此版本中,用户选择文本后,你可以顶部的ActionBar中显示对选择文本的复制、粘贴、剪切等按钮,具体的参考官网中提供的步骤。

9、浏览器书签的变化

  不在支持全局的书签,应用不再支持获取和保存浏览器中的书签。android.provider.Browser.getAllBookmarks()  和 android.provider.Browser.saveBookmark() 方法被移除,同样地,READ_HISTORY_BOOKMARKS和 WRITE_HISTORY_BOOKMARKS 权限被移除。

10、Android Keystore的变化

  Android Keystore Provider不再支持DSA,ECDSA还在支持,没用过此功能,不知道有什么影响。

11、WIFI和网络的变化

 

 Posted by on 2016-08-05
8月 022016
 

1.首先要有一个Long型的主键

2.该主键的初始值要赋值为null

 

如下:

原理是:

当id的初始值设为null时,执行insert into 语句时,id的值也为null,然后数据库系统会自己计算这个,如下这个sql语句

 

7月 262016
 

可以通过以下几种方法实现EditText的只读属性

1. 方法一:使用EditText的android:Editable属性

  将EditText的Editable属性设置为false后,EditText就成只读了,缺点是不能在java代码中动态设置,而且这个属性android官方已经不推荐使用了,官方的解释是要想一个view可编辑(Editable=true)可以用EditText,不可编辑用TextView就可以了 8-O 

2. 方法二:使用TextView替代

  既然TextView和EditText就差一个可编辑,那么用一个TextView去替代EditText好了。只读的时候显示TextView隐藏EditText,编辑的时候显示EditText隐藏TextView,不过TextView必须和EditText用同样的样式,以不让用户查觉到组件变换了。本人没亲测这种方法,大家有兴趣的话可以试试。

3. 方法三:设置EditText的keylistener来实现

  代码不多,直接把完整的代码贴出来吧

  布局文件代码

 

proguard文档地址

 分类:Android, Java 阅读 (422)  No Responses »
7月 032016
 

在Android的sdk/tools/proguard/docs/index.html

比如:

file:///home/liuderu/software/adt-bundle-linux-x86_64-20131030/sdk/tools/proguard/docs/index.html

 Posted by on 2016-07-03

当continue遇上finally

 分类:Java, Java语言 阅读 (213)  当continue遇上finally已关闭评论
6月 292016
 

当continue遇上finally,continue执行后仍会执行finally中的代码,如下代码:

运行输出结果:

 

 Posted by on 2016-06-29

Java位操作优先级问题一例记录

 分类:Android, Java, Java语言 阅读 (191)  Java位操作优先级问题一例记录已关闭评论
6月 262016
 

今天在对数据进行位操作和加操作混合运算的时候,发现得到的结果不对

int result = src << 4 + 10;

后来发现加法操作符的优先级要高于位操作,所以造成此问题。

附Java操作符的优先级表如下:

 Posted by on 2016-06-26