zoukankan      html  css  js  c++  java
  • 安卓和 java 学习笔记

    1、访问权限为 private 的成员变量或方法,需要执行setAccessible() 方法,并将入口参数设置为 true; 否则不允许访问。

    2、为了保证线程的安全,可以使用同步块 synchronized 关键字。还有一种是定义同步的方法,同步方法前面有 synchronized。

    // 1
    synchronized
    (Object){ ...// } // 2 public synchronized void doit(){ // 将共享资源操作放置在这里 }

     3、关于 try catch finaly 的

    先看下面这个程序:

    protected boolean fina11(){
            try{
                Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
                return true;
            }catch (Exception e){
    
            }finally {
                Toast.makeText(this, "finally", Toast.LENGTH_SHORT).show();
            }
            return false;
        }

    运行后执行的结果为 "You clicked Add", "finally" ,返回值 是true;不是false; 如果把 return true 给注释掉;那么就会返回 false;

    4、可在 widegt 中发送 intent 给服务端,服务端注册接受即可,但是发送给activity 的话有点困难。

    5、正常情况下requestWindowFeature(Window.FEATURE_NO_TITLE)是可以生效的,但是当Activity继承子AppCompatActivity的时候,这个就失效了 

    第一种解决办法,添加红色代码,注意要放在最后:

    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
            if (getSupportActionBar() != null){
                getSupportActionBar().hide();
            }
        }

    第二种解决办法,添加红色代码,注意代码顺序,放中间,其他位置都不可以:

    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
        }

     

    6、关于给 recycleView 添加 点击事件的实现:

    首先我们给其实现了 implements View.OnClickListener  ;然后重写了 onClick 事件。 在 onclick中我们把 对 接口 OnItemClickListener 中的方法 onItemClick 进行了调用。从而实现了点击 item 事件。具体代码参见 https://github.com/huanshen/Learn-Android/tree/master/recycleTest。下载编译运行即可。

    其实简单来说 只要实现 implements View.OnClickListener  ,点击之后就会调用  onClick 方法,但是因为是全局相应的,而不是 一个 item, 所以我们就重新写了一个接口,并定义了一个 onItemClick 方法。

    7、String.valueOf 和 .toString 方法

    首先我们看 String.valueOf 的源码:

    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

    可以发现, String.valueOf 的实现其实也是调用了 .toString  的方法,只不过,它还对数据为空的情况进行了处理。返回 “null”。

    8、在实际应用场景中,假设A Activity位于栈顶,此时用户操作,从A Activity跳转到B Activity。那么对AB来说,具体会回调哪些生命周期中的方法呢?回调方法的具体回调顺序又是怎么样的呢?

    开始时,A被实例化,执行的回调有A:onCreate -> A:onStart -> A:onResume。

    当用户点击A中按钮来到B时,假设B全部遮挡住了A,将依次执行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop。

    此时如果点击Back键,将依次执行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。

    至此,Activity栈中只有A。在Android中,有两个按键在影响Activity生命周期这块需要格外区分下,即Back键和Home键。我们先直接看下实验结果:

    此时如果按下Back键,系统返回到桌面,并依次执行A:onPause -> A:onStop -> A:onDestroy。

    此时如果按下Home键(非长按),系统返回到桌面,并依次执行A:onPause -> A:onStop。由此可见,Back键和Home键主要区别在于是否会执行onDestroy。

    此时如果长按Home键,不同手机可能弹出不同内容,Activity生命周期未发生变化(由小米2s测的,不知道其他手机是否会对Activity生命周期有影响)。

    9、IPC 通信方式的优缺点和适用场景

    10、Android中的多进程模式

    (1) 通过给四大组件指定 android:process 属性就可以开启多进程模式,默认进程的进程名是包名 packageName,进程名以 : 开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,而进程名不以:开头的进程属于全局进程,其他应用通过 ShareUID 方法可以和它跑在同一个进程中。

    android:process=":xyz" //进程名是 packageName:xyz
    android:process="aaa.bbb.ccc" //进程名是 aaa.bbb.ccc

    (2) Android系统会为每个应用分配一个唯一的 UID,具有相同 UID 的应用才能共享数据。两个应用通过ShareUID跑在同一个进程中是有要求的,需要这两个应用有相同的 ShareUID并且签名相同才可以。 在这种情况下,它们可以相互访问对方的私有数据,比如 data 目录、组件信息等,不管它们是否跑在同一个进程中。如果它们跑在同一个进程中,还可以共享内存数据,它们看起来就像是一个应用的两个部分。 

    (3) android 系统会为每个进程分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,所以不同的虚拟机中访问同一个类的对象会产生多个副本。

    (4) 使用多线程容易造成以下几个问题:

    1. 静态成员和单例模式完全失效;

    2. 线程同步机制完全失效:无论锁对象还是锁全局对象都无法保证线程同步;

    3.  SharedPreferences 的可靠性下降:SharedPreferences 不支持并发读写;

    4. Application 会多次创建:当一个组件跑在一个新的进程的时候,系统要在创建新的进程的同时分配独立的虚拟机,应用会重新启动一次,也就会创建新的 Application。运行在同一个进程中的组件是属于同一个虚拟机和同一个 Application。

    同一个应用的不同组件,如果它们运行在不同进程中,那么和它们分别属于两个应用没有本质区别。

    11、Handler 的操作

    class MyHandler extends Handler {
        @Override
        public void handleMessage(Message msg){
            switch(msg.what){
                case 1//处理消息
                    break;
            }
        }
    }
    
    // 新建一个 MyHandler 的实例,用来传递消息
    MyHandler mHandler = new MyHandler();
    // 开启新的线程
    new Thread() {
        public void run() {
            // 处理耗时操作,处理完成后发送消息
            mHandler.sendEmptyMessage(123);
        };
    }.start();

    当我们在一个子线程中创建 Handler 的实例的时候,会抛出异常,原因是因为该线程中没有 Looper 对象。handler 的原理是要与 MessageQueue 建立联系,而  MessageQueue 又被封装在 Looper 中,因此,创建 Handler 时,一定不能为空。

    // 将会抛出错误
    new Thread() {
        MyHandler mHandler = null;
        public void run() {
            mHandler = new MyHandler();
        };
    }.start();
    // 解决如下 new Thread() { MyHandler mHandler = null; public void run() { // 为当前线程创建Looper, 并且绑定到 Threadlocal 中 Looper.Prepare(); mHandler = new MyHandler(); // 启动消息循环 Looper.loop(); }; }.start();

     12、canvas.save 和 restore

    save和restore方法必须是配对使用的,restore方法前必须有save方法,不然会报Underflow in restore错误。但是也可以只有save方法,不过只有save方法我觉得其实是无意义的。

    save方法用于临时保存画布坐标系统的状态

    restore方法可以用来恢复save之后设置的状态,

    可以简单理解为调用restore之后,restore方法前调用的rotate/translate/scale方法全部就还原了,画布的坐标系统恢复到save方法之前,但是这里要注意的是,restore方法的调用只影响restore之后绘制的内容,对restore之前已经绘制到屏幕上的图形不会产生任何影响。

  • 相关阅读:
    CSU1784
    HDU 6128 Inverse of sum(数学)
    容斥原理入门
    HDU 6129 Just do it(规律)
    HDU 6140 Hybrid Crystals(zz)
    HDU 6143 Killer Names(排列+容斥,dp)
    zzuli 2177 Contest
    zzuli 2180 GJJ的日常之沉迷数学(逆元)
    除法逆元入门
    乘法逆元数论篇
  • 原文地址:https://www.cnblogs.com/huansky/p/7141817.html
Copyright © 2011-2022 走看看