diff --git a/2014/09/14/Ubuntu System Install/index.html b/2014/09/14/Ubuntu System Install/index.html index 2e318991..89accec5 100644 --- a/2014/09/14/Ubuntu System Install/index.html +++ b/2014/09/14/Ubuntu System Install/index.html @@ -789,9 +789,15 @@
和上一个例子不同的是,这一个Notification跳转的位置并不是OtherActiivty
,
而是直接跳转到MainActivity
.
问题
非常不幸的事,他并不能够正常接收么Intent传过来的参数。至于为什么,我也不知道。
如您知道这个的具体原因请告知我(邮箱:lovecluo@gmail.com)。
问题
非常不幸的事,他并不能够正常接收么Intent传过来的参数。至于为什么,我也不知道。
如您知道这个的具体原因请告知我(邮箱:lovecluo@gmail.com)。
解决办法
虽然不知道是什么原因造成了这个问题,但是最终还是找到了解决方案:
解决方法如下:
@@ -762,9 +762,15 @@[1] onNewIntent调用时机
- +是不简单多了呢?好东西就应该和小伙伴一起用。你说对不?
- +看了代码,你就会觉得特别的简单。
- +这一次的空指针的最根本原因是在父类的构造方法中执行了子类实例变量的初始化
操作,这是一个非常不合理的举动。如果子类属性中的东西应该在子类中进行初始化,
而不是在父类中调用初始化方法。
代码木有上传上来,如果你想看看这个丑陋的代码是怎么写的,你可以邮件联系我:
lovecluo@nightweaver.org
代码木有上传上来,如果你想看看这个丑陋的代码是怎么写的,你可以邮件联系我:
lovecluo@nightweaver.org
更新代码地址:
- +多了解一下最新的技术,多去看看那些大神写的Blog,对自己的提升会比较大,虽然你不能很好的
去读懂官方给出的英文文档,但是很多技术牛人会将新技术以简单通俗的例子告诉给你。
最后,感谢“郭霖”大神,他的技术博客地址:传送门
- +当然,上面的命令你需要在root用户的权限下才可以用。
- +参考资料
- +如下图所示:
- +不是什么高深的技术,只是记录一下。
- +原文地址 https://github.com/futurice/android-best-practices
- +就是如此的简单,但是为了弄这个东西,还是花了不少时间。
这种方法虽然可以实现功能,但是我觉得这样子做并不好。如果你有更好的解决方案。
望赐教,不胜感激。
在github上面看到一个PPT,详细的写到了TextView的用法。
参考地址: Advanced Android TextView
- +If you release an application to the app store or to a client with this kind of logger, you should disable logging by default and add a switch in the preferences to enable logging on demand. If the logger is always enabled, your application will often write to the primary storage and to the logcat, which is an unnecessary overhead when everything works correctly. Also, the size of the log file should be limited in some way to avoid filling up the primary storage.
- +就是HttpHeaderParser.parseCacheHeaders(response)
实现Response
向Cache.Entry
的转换。
当然,你可以实现自己的parseCacheHeaders
的方法,来实现你自己的缓存侧略。
到此为止,基本写完了我所读到的Volley
中实现Cache
的方法。如果你对本文或者我有什么意见或者建议。
请骚扰我:lovecluo@nightweaver.org
到此为止,基本写完了我所读到的Volley
中实现Cache
的方法。如果你对本文或者我有什么意见或者建议。
请骚扰我:lovecluo@nightweaver.org
在使用Android编写代码的时候,会有一个习惯,就是在定义的变量前面加上前缀上加m
,使用Alt + Insert
的时候,生成的构造方法和get,set方法会在参数和方法名上加上m
, 很是不爽。解决办法:
File –> Setting –> Code Style –> Java –> Code Generation ; 然后在 Field
那一行的Name Prefix
上写上m
。就这么简单
上面例子中,应该是这两个的交叉点,Android 5.0和Android 4.4中的执行策略不一样而引起的问题.
经测试,是因为Dalvik与Art在运行的时候,运行机制是不同的。
- +在使用的时候,只需将不需要动画的Activity的style
设置成这个就可以了
在使用的时候,只需将不需要动画的Activity的style
设置成这个就可以了
最后的解决办法就是先将ruby
升级到最新版本,然后就可以顺利安装rails了。在此记录一下。
原文地址 https://github.com/futurice/android-best-practices/edit/master/translations/Chinese/README.cn.md
- +以上代码是Android TextView
设置字体的源码。可以看出来,使用setTextSize(float size)
的时候,默认单位为sp
如果你自己从xml
中读的时候,最好使用setTextSize(int unit, float size)
这个方法。
内部类并不是像调用那样,使用.
, 而是使用$
也就是说android:process=”:remote”,代表在应用程序里,当需要该service时,会自动创建新的进程。而如果是android:process=”remote”,没有“:”分号的,则创建全局进程,不同的应用程序共享该进程。
-转载地址: Android 手动显示和隐藏软键盘
- +就是如此的Easy,就把View添加到视图中去了。
- +参考:
How to assign padding to Listview item divider line
- +所以,虽然下面有空隙,TextView 也拿到到足够的空间进行展示,导致TextView中的内容显示不完整
- +${var:0-9:4}
其中的0-9表示左边第9个字符开始, 4表示截取字符个数,如果没有就是到结束
以前使用淘宝的Gem sources, 但是现在以经停止维护了。现在可以使用: http://gems.ruby-china.org/
使用见官网。
- +使用参考:
- +SurfaceTexture 在创建时即会创建作为消费者的 BufferQueue,后面的 updateTexImage 即从 BufferQueue 中取出一个 buffer。
- +以上为 Android 操作系统中虚拟机的进化过程,以及开发者可以在加速 APP 运行可以做的事情。
- +以上。
- +有了上面的脱糖流程,既然可以在编译时,就能实现 lambda 的逻辑,为什么还要添加 invokedynamic
指令呢? 这不得不提 Java 是一种静态类型语言,所有的东西都是在编译时都已经确定好了,静态类型的语言在运行相对效率更高,但灵活性就有所降低。而 invokedynamic
的设计就是让 JVM 可以更加的灵活,让基于 JVM 的语言设计者,可以有更多的自由度。
一个好的环境,能够帮助我们提高工作中的效率,也能让自己的电脑使用起来更加的舒心。当然在使用电脑的过程中,也需要不断优化自己的环境,让电脑更加方便使用。
- +ProGuard 是在打包过程中一个非常常用的功能,但其涉及点很多,少有去花时间深入了解其实现原理。文中也仅记录使用过程中遇到的知识点。当遇到问题,多去看看官方文档,可能会发现之前从未注意到的亮点。
- +将生成的混淆配置添加到 proguardFiles
里面,就可以将生成的规则应用于混淆的流程中。
以上,本文从 SDK 打包混淆所遇到的问题开始,记录了使用 ProGuard 以及编写自动化脚本过程所遇到的问题、我自己的思考、以及解决方案。在这之中,针对遇到的问题,我所提到的解决方案并不一定是最佳或最优方案,只是在那个时候,实现最方便,也能满足我的需求。如果朋友们有什么新奇的想法,欢迎与我沟通交流。
- +Intellij IDEA
中为 JDK 添加 sourcepath
后,就可以非常愉快的调试看代码了,具体设置步骤可以看下图红框圈出来的部分。
-
+ 创建于 2005 年的 Git 中,有很多知识点值得学习,建议有时间同学深入研究。最后,如果文中有错误和遗漏,欢迎与我联系。
- +更多细节信息,请参考官方文档。
- +到目前为止,我们已经学会了在 Android 上使用图片编码并对其进行操作和处理的必要技能。希望这篇文章有助于您更好地理解 Android 中的图片编码,让您在开发时能够更加得心应手。
- +Intellij IDEA
中的 ▶︎ ,输出的产物与用命令行执行出来的结果一致。
当拿到源码后,第一步就是将源码跑起来,这能够有助于我们对源码理解,以及后续分析源码时进行调试。本文内容很简单,但纸上得来终觉浅,绝知此事要躬行。朋友们可以自己去将源码下载下来,并使用你所熟知的 IDE
将其运行起来,相信你也有很多的收获,也欢迎各位与我交流。
剩下解析类成员的逻辑与前面类解析的逻辑相似,按照 EBNF 格式进行解析即可, 感兴趣的同学可以自行阅读源码。
ProGuard 配置文件解析是非常重要的一部分内容,在 ProGuard 后续的执行逻辑中,会经常使用到本文中解析出来配置信息,可从官方文档详细了解一下各配置选项的作用级使用方法,以便能更好的理解后面的内容。在解析配置文件中,提到的 EBNF 是描述计算机编程语言的上下文无关文法的符号表示法,在编程语言开发中可能会经常遇到,此语法不复杂,可以去百科上读一读,相信你会有很多的收获。
- +在本文的开头,提到的 AppView
就是用来存储类数据的,代码逻辑会将输入参数中的 programJars
和 libraryJars
里包含的所有类解析出来,构建生成 ProgramClass
,分别存储在 AppView
这个类中的 programClassPool
以及libraryClassPool
中, 用于后续混淆使用。当然,除了 class
文件,还存在一些资源文件的读取逻辑,如果你感兴趣,可以去翻翻源码。
以上为 ProGuard 中 Java 类文件的读取与解析的内容,如果本文中有描述得不清楚或不对的地方,欢迎各位朋友一起交流讨论。
- +因为访问者模式实现非常的不好理解,在项目中使用此模式会导致代码的可读性降低。所以在项目中是否需要使用此模式,需要谨慎评估。
最后,ASM 以及 ProGuard 中对 Class 文件操作都很好地应用了访问者模式,有兴趣可以深度理解一下其源码实现,相信有不一样的收获。
- +R8 issues this warning if you use an extends
rule to match descendents of an interface rather than implements
, regardless of whether the descendents you’re trying to match are classes or interfaces.
If the specified rule is a custom rule that you have created, you can update the rule to use implements
rather than extends
.
However, some libraries, including Android support libraries, contain rules that will produce this warning.
Unfortunately, there is no easy way to resolve or suppress the warning in that case.
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
+long sdAvailSize = (long)stat.getAvailableBlocks()
+ * (long)stat.getBlockSize();
+long sdTotalSize = (long)stat.getBlockCount()
+ * (long)stat.getBlockSize()
+
+在values
文件夹中创建ids.xml
文件, 文件目录为:values/ids.xml
我们有时候,会在代码中定义一个组件,如TextView
,但是我们想给他设置一个Id,又不知道该设置一个
什么值比较好,就可以用上术方法来定义一个id
, 具体代码如下:
<?xml version="1.0" encoding="utf-8"?>
+<values>
+<item name="custom_item_id" type="id"></item>
+</values>
+
+<!-- .2f表示的是保留三位小数的浮点数 -->
+<string name="book">书名 (字符串)%1$s,作者(字符串)%2$s,编号(整数)%3$d,价格(浮点型):%4$.2f</string>
+
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if ((System.currentTimeMillis() - mExitTime) > 2000) {
@@ -750,39 +766,6 @@ Android 按两次返回键
return super.onKeyDown(keyCode, event);
}
-在values
文件夹中创建ids.xml
文件, 文件目录为:values/ids.xml
我们有时候,会在代码中定义一个组件,如TextView
,但是我们想给他设置一个Id,又不知道该设置一个
什么值比较好,就可以用上术方法来定义一个id
, 具体代码如下:
<?xml version="1.0" encoding="utf-8"?>
-<values>
-<item name="custom_item_id" type="id"></item>
-</values>
-
-StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
-long sdAvailSize = (long)stat.getAvailableBlocks()
- * (long)stat.getBlockSize();
-long sdTotalSize = (long)stat.getBlockCount()
- * (long)stat.getBlockSize()
-
-android.applicationVariants.all { variant ->
- variant.outputs.each { output ->
- def outputFile = output.outputFile
- if (outputFile != null && outputFile.name.endsWith('.apk')) {
- def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}-${ defaultConfig.versionCode}.apk")
- output.outputFile = new File(outputFile.parent, fileName)
- }
- }
-}
-
-//在这个地方,应该使用
-//android:textColor="@drawable/text_color"
-
-// text_color.xml
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true" android:color="@color/click_blue_color"></item>
- <item android:color="@color/blue_color"></item>
-</selector>
-
public static String formatSize(long size) {
if (size < 1024) {
return String.format("%dByte", size);
@@ -845,8 +828,28 @@ Android TextView 设置字
以上代码是Android TextView
设置字体的源码。可以看出来,使用setTextSize(float size)
的时候,默认单位为sp
如果你自己从xml
中读的时候,最好使用setTextSize(int unit, float size)
这个方法。
<!-- .2f表示的是保留三位小数的浮点数 -->
-<string name="book">书名 (字符串)%1$s,作者(字符串)%2$s,编号(整数)%3$d,价格(浮点型):%4$.2f</string>
+java反射内部类
+- 在java中反射加载类的方法如下
+
+Class rClass = Class.forName("android.R");
+
+
+- 加载android.R.attr
+
+Class attrClass = Class.forName("android.R$attr");
+
+
+内部类并不是像调用那样,使用.
, 而是使用$
+
+Android文字颜色选择器
//在这个地方,应该使用
+//android:textColor="@drawable/text_color"
+
+// text_color.xml
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true" android:color="@color/click_blue_color"></item>
+ <item android:color="@color/blue_color"></item>
+</selector>
Android 混淆记录
--keep class cn.knero.model.*{
public <methods>; // 不混淆public的方法
@@ -875,19 +878,6 @@ Android 混淆记录
-java反射内部类
-- 在java中反射加载类的方法如下
-
-Class rClass = Class.forName("android.R");
-
-
-- 加载android.R.attr
-
-Class attrClass = Class.forName("android.R$attr");
-
-
-内部类并不是像调用那样,使用.
, 而是使用$
-
Android显示密码
// 方法1:
if (mIsShowPsw) {
@@ -906,12 +896,26 @@ Android显示密码
mPswEdit.setInputType(129);
}
+gradle打包的时候,自动重命名APK文件
android.applicationVariants.all { variant ->
+ variant.outputs.each { output ->
+ def outputFile = output.outputFile
+ if (outputFile != null && outputFile.name.endsWith('.apk')) {
+ def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}-${ defaultConfig.versionCode}.apk")
+ output.outputFile = new File(outputFile.parent, fileName)
+ }
+ }
+}
+
Android 截取EditText输入的Emoji表情
public String subInputText(String inputText,int index) {
int unicode = Character.codePointAt(text, index);
int skip = Character.charCount(unicode);
mInputSquares[textCount++].setText(text.substring(index, index+skip));
}
+Android TextView setTextSize
Android TextView 在设置TextSize 值很大的时候,会报如下错误Font size too large to fit in cache
。 修改方法如下:
+TextView bigText = (TextView) findViewById(R.id.bigtext);
+bigText.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+
XML 实现 ListView divider margin
<?xml version="1.0" encoding="UTF-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="50dp"
@@ -924,10 +928,6 @@ XML 实现 ListView divide
参考:
How to assign padding to Listview item divider line
-Android TextView setTextSize
Android TextView 在设置TextSize 值很大的时候,会报如下错误Font size too large to fit in cache
。 修改方法如下:
-TextView bigText = (TextView) findViewById(R.id.bigtext);
-bigText.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
-
获取Logcat信息
private void getLogcat( final LogcatListener listener ) {
new Thread() {