Android个人学习小结2017.1

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/forgot2015/article/details/55007497

1、人工画的二维码也能识别的,要分好格子来画
2、二维码有一定容错性,一般遮住一小部分仍然能识别
3、ANR:Application Not Responding 应用响应超时
三种常见类型

  • KeyDispatchTimeout(5 seconds) – 主要类型
    按键或触摸事件在特定时间内无响应
  • BroadcastTimeout(10 seconds)
    BroadcastReceiver在特定时间内无法处理完成
  • ServiceTimeout(20 seconds) – 小概率类型
    Service在特定的时间内无法处理完成

4、java impl 是一个资源包,用来存放java文件的。
在Java开发中,通常将后台分成几层,常见的是三层mvc:model、view、controller,模型视图控制层三层,而impl通常处于controller层的service下,用来存放接口的实现类,impl的全称为implement,表示实现的意思

5、HttpURLConnection对象不能直接构造,需要通过URL.openConnection()来获得HttpURLConnection对象,因为HttpURLConnection是抽象类,不能new
示例代码如下:

String mUrl = "http://www.baidu.com/";
URL url = new URL(mUrl); 
HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();

6、设置点击dialog外部无效
builder.setCancelable(false);
7、转别人的“那么什么是回调函数呢?我认为,回调函数就是预留给系统调用的函数,而且我们往往知道该函数被调用的时机。这里有两点需要注意:第一点,我们写回调函数不是给自己调用的,而是准备给系统在将来某一时刻调用的;第二点,我们应该知道系统在什么情形下会调用我们写的回调函数。
  这里举个现实生活中”回调函数”的例子来帮助大家更好的理解。我们平时考试答题的第一件事是干嘛?没错,是写上学号和姓名。这里注意了,我们填写学号和姓名不是给自己看的(即该方法不是给自己调用的),而是给老师登记分数时看的(预留给系统将来调用),这其实就是一个回调的应用。

8、一个退出登录Dialog的写法

AlertDialog.Builder builder;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//手机android 版本API>=21时调用
            builder = new AlertDialog.Builder(mContext, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
        } else {//手机android 版本API<21时调用
            builder = new AlertDialog.Builder(mContext, AlertDialog.THEME_HOLO_LIGHT);
            // 包含旧的API的代码块
        }
        builder.setTitle("退出登录?")
                .setPositiveButton("是", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        exit_yes();
                    }
                })
                .setNegativeButton("否", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                    }
                });
        AlertDialog dialog = builder.create();
        dialog.show();

9、java类中的argument list 若为 “Object…args” 如
public StringResult isValid(Object… args)
意为有不定数目的Object 类型 的argument
例子,输出你所定义的值

public class ObjectDemo {
    public static void main(String[] args) {
        int aa = 0;
        aa("sdfsf","String2","ddddd",aa);
    }
    public static void aa(Object... args){
        for (Object str:args ) {
            System.out.println(str);
        }
    }
}

10、逃避解决不了问题,越早面对越早解决
11、可用vector来做资源图,纯代码,节省空间
12、转别人的“Intent启动Activity分为两种,显示启动和隐式启动,显示启动就是在初始化Intent对象的时候直接引用需要启动的Activity的字节码,显示引用的好处就是可以直接告诉Intent对象启动的Activity对象不需要执行intent filter索引需要启动哪一个Activity,但是显示引用不能启动其他进程的Activity对象,因为无法获取其他进程的Activity对象的字节码,而隐式启动则可以通过配置Intent Filter启动其他进程的Activity对象,因此在应用内,我们一般都是使用显示启动的方式启动Activity,而如果需要启动其他应用的Activity时,一般使用隐式启动的方式。”
13、Linus Torvalds:“Read The Fucking Source Code
talk is easy,show me the code”
14、“JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:”程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

15、“大多数人做产品(功能)都会经历这样的成长阶段:
1. 面向兴趣编程
2. 面向功能编程
3. 面向臆想用户编程
4. 面向用户反馈编程
5. 面向真实需求编程
6. 面向商业编程
7. 面向未来编程”

16、java集合框架 hashmap使用
遍历hashmap

HashMap<String,String> hm =new HashMap<>();
hm.put(key,value);
for(Map.Entry<String,String> entry:hm.entrySet()){
    Logger.e(entry.getKey()+","+entry.getValue());
}

17、android修改hosts,需要用root explorer,并且要有root权限
hosts文件复制到system/etc/替换原文件即可。
18、Set、List和Map可以看做集合的三大类。

  • List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
  • Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是不能集合里元素不允许重复的原因)。
  • Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。

对于Set、List和Map三种集合,最常用的实现类分别是HashSet、ArrayList和HashMap三个实现类。
19、一维数组初始化的三种方式
String[] str = new String[5]; //创建一个长度为5的String(字符串)型的一维数组
String[] str = new String[]{“”,”“,”“,”“,”“};
String[] str = {“”,”“,”“,”“,”“};
20、git提示:Your local changes to the following files would be overwritten by merge
解决方法:放弃本地修改,直接覆盖
git reset –hard 返回上次commit,放弃本次修改
git pull origin master 重新pull
21、androidstudio R文件所在路径 build/generated/source/r/debug/com…/R
22、当用android内的webView打开微博个人页时,显示空白,因为要添加javaScript脚本支持才行
// 得到设置属性的对象
WebSettings webSettings = myWeb.getSettings();
// 使能JavaScript
webSettings.setJavaScriptEnabled(true);
// 支持中文,否则页面中中文显示乱码
webSettings.setDefaultTextEncodingName(“GBK”);

23、Annotation是继承自Java.lang.annotation.Annotation的类,用于向程序分析工具或虚拟机提供package class field methed 等方面的信息,它和其他类没什么区别,除了使用方式.

@Documented  //这个Annotation可以被写入javadoc  
@Inherited       //这个Annotation 可以被继承  
@Target({ElementType.CONSTRUCTOR,ElementType.METHOD}) //表示这个Annotation只能用于注释 构造子和方法  
@Retention(RetentionPolicy.CLASS) //表示这个Annotation存入class但vm不读取  
public @interface MyAnnotation {  
   String value() default "testAnnotation";  
 }  

24、在Intellij中按F1可以调出帮助文档
25、设置view圆角的方法,建一个xml文件,如 corners_bg,到时候view中引用即可

android:background=”@drawable/corners_bg”

<?xml version="1.0" encoding="utf-8"?>  
    <shape xmlns:android="http://schemas.android.com/apk/res/android">    
       <solid android:color="#000000" />    
         <corners android:topLeftRadius="10dp"   
                   android:topRightRadius="10dp"    
                   android:bottomRightRadius="10dp"   
                   android:bottomLeftRadius="10dp"/>    
     </shape> 

26、内存泄露这个术语在Java中意味着:内存中存在着不该存在的对象,通常来说是有些不再使用的资源却仍存储在集合中。
27、测试编译时异常,被除数为0

public void crashClick(View view) {
        int err = 1 / 0;
    }

28、计算方法执行前后耗时

long startTime = System.currentTimeMillis();
int m =Fibonacci(n);
long endTime = System.currentTimeMillis();
float second = (endTime-startTime)/1000f;

29、网站扩展名转向,隐藏jsp,php,asp,aspx等扩展名,因为html或者无扩展名更有利于搜索引擎的收录,SEO优化
30、自定义progressBar
在drawable中的xml

<?xml version="1.0" encoding="UTF-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/loading"
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="360">
</rotate>

在value中的style

<style name="mProgress_circle">
        <item name="android:indeterminateDrawable">@drawable/myprogress_circle_style</item>
        <item name="android:indeterminateBehavior">repeat</item>
        <item name="android:indeterminateDuration">1000</item>
        <item name="android:minWidth">50dp</item>
        <item name="android:minHeight">50dp</item>
        <item name="android:maxWidth">50dp</item>
        <item name="android:maxHeight">50dp</item>
    </style>

布局中引用

<ProgressBar
        android:id="@+id/progressBar"
        style="@style/mProgress_circle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"  />

31、“Android:layout_weight的真实含义是:如果View设置了该属性并且有效,那么该 View的宽度等于原有宽度(android:layout_width)加上剩余空间的占比。
从这个角度我们来解释一下上面的现象。在上面的代码中,我们设置每个Button的宽度都是match_parent,假设屏幕宽度为L,那么每个Button的宽度也应该都为L,剩余宽度就等于L-(L+L)= -L。
Button1的weight=1,剩余宽度占比为1/(1+2)= 1/3,所以最终宽度为L+1/3*(-L)=2/3L,Button2的计算类似,最终宽度为L+2/3(-L)=1/3L。”
32、ios和android消息推送的区别,ios是系统有统一的消息管理机制,应用只需要发消息,ios系统接收并统一管理,发送给客户, 而android通常是应用直接推送给客户,这样一是不一定能成功推送,而是后台推送服务耗电。 后面谷歌也学苹果有了消息统一管理机制,但android阵营用的比较少,各种定制ROM都用自家的推送

33、抽象类无法直接new 实例来使用,但可以创建一个匿名内部类来用,由于这个内部类没有名字,所以只能用一次,适合只用一次抽象类的时候用,不必再去继承抽象类再写

34、可写多个setContentView文件,但只会加载最后一个,如
setContentView(R.layout.activity_login);
setContentView(R.layout.progressBar);

35、Context context=MainActivity.this定义一个这是上下文对象context,并赋值为MainActivity这个类对象
36、数组s2遍历的方法:

for (String s1:s2 ) {
            System.out.println(s1);
        }

法2:System.out.println(Arrays.toString(s2));

37、转“为什么我们的后台进程/Service会被结束掉?
我想到的是有三个方面:
Android系统内存回收机制;
各厂商对后台程序的一个管理制度(就是允许程序后台运行那个);
第三方软件的清理(360什么的)。

结论和待续:
1. 一般的应用添加到后台保护进程后,改个onStartCommand返回值,再加个通知。基本上大部分都能保活了。
2. 双服务我觉得没有native守护进程来的好,虽然360,微信什么的都有几个进程服务,但如果不添加到后台保活的话,效果一样不能保活,也会进入停止状态。
3. 但是.360手机助手会创建双natice守护进程做相互的看守。存活的效果会高一点点。“没添加到后台保活”一般只会杀一次,(魅族是屏幕关闭后5分钟,华为TL00H是屏幕关闭时)。

Android应用实现保活的基本原理总结
都是通过双进程互拉以及设置进程的重要性,除非你root后,把自己的进程设置成系统进程。
互拉的方式有很多种:
可以通过监听系统广播来把自己拉起来
可以多个app相互拉
可以把自己的服务搞成前台服务
在service的onstart方法里返回 STATR_STICK
添加Manifest文件属性值为android:persistent=“true”
覆写Service的onDestroy方法
服务互相绑定
设置闹钟,定时唤醒
自己的app在native层fork一个子进程来与主进程互拉。

综上所述,总结下来就是,目前实现Android后台保活没有完美实现,只能针对不同的机型综合使用上面列举的方法,同时祈祷自已APP的用户不要遇到奇葩机型的保活问题。

38、用picasso,glide等库时没效果,有可能是没有添加permission,好坑啊

<uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

39、实现接口中的方法时,记得要加修饰符public, 不能省略。 Interface中可以省略,时因为他默认是public的,但实现接口的类省略public就变成缺省default了,访问权限出错,例如

@Override
     public void walk(){
System.out.println("men can walk");
     }
     @Override
      void chest(){ //出错,要加public修饰符
     System.out.println("men's chest is small");
     }

部分知识来自网络,如有侵权,请联系删除,谢谢

展开阅读全文

没有更多推荐了,返回首页