android 学习笔记

1. setContentView(R.layout.activity_game); 这个代码会把 activity_game 这个 xml 里面包含的 fragment 对应的类 都进行 onCreate,然后 onCreateView,之后才执行这个语句下面的句子。

2. SharedPreferences 保存少量数据

private SharedPreferences sp;
private final static String PREFRENCE_FILE_KEY = "com.shared_preferences";
sp = getSharedPreferences(PREFRENCE_FILE_KEY, MODE_PRIVATE);

final SharedPreferences.Editor editor = sp.edit();
editor.putInt("id",1);
editor.putString("name","小熊");
editor.putInt("age",24);
editor.commit();

TextView textView = (TextView)findViewById(R.id.text);
String message = "id = " + mSharedPreferences.getInt("id",-1)  
        + ",name = " + mSharedPreferences.getString("name","无")
        + ",age = " + mSharedPreferences.getInt("age",-1)+"。";
textView.setText(message);

3. println() 函数的输出,可以在 logcat 里面,过滤填写 system.out,即可看到了。参考:http://www.pianshen.com/article/6032179657/

4. BroadcastReceiver 可以用来针对一些事情进行广播,比如说耳机插入,蓝牙接入等等。广播可以是标准广播,大家都能收到,或者有序广播,前面收到的可以截断广播。

5. totast 用来进行小的信息提示,存在2秒左右。

6. bundle 作为信息的载体,内部是一个 Map<string, object>, intent 持有一个 bundle,可以作为 activity 之间信息交互的桥梁。message 也可以持有 bundle,可以用于线程之间信息的交互。

7. ui 的线程作为主线程,其他的线程都是辅助线程,他们之间的通讯需要使用 handle 和 message来进行,具体参考这篇文章.

https://www.cnblogs.com/fuck1/p/5513412.html

8. onConfigurationChanged() 这个主要用于屏幕在横屏和竖屏之间切换时候触发。

9. Runnable 只是一个接口,其中的 run() 是执行函数体。在主线程中直接调用这个 run(),那么就是跑在主线程里面。只有使用 new Thread()来实现这个线程,然后调用 start() 来启动新的线程,新的线程会自动运行 run() 这个函数体,运行结束之后,新线程结束。 具体参考: https://www.cnblogs.com/yuhanghzsd/p/5581918.html

10. synchronized 用来多线程中作为锁使用。可以直接修饰方法,也可以 synchronized(tmp) 这个来锁一个变量。都能够使得相应的方法锁住。在代码块中可以使用 notifyAll() 来唤醒其他等待锁的线程。 参考:https://www.jianshu.com/p/35af333fdde4 和 https://www.jianshu.com/p/6999a3fa7372

11. wait() 需要在synchronized 中使用。 参考:https://blog.csdn.net/qq_30379689/article/details/53863082

12. 接口回调函数。首先定义一个接口,接口中包含方法的申明。然后在模块类中定义一个接口变量,然后在模块类中的方法里面对这个接口变量赋值,然后在模块类中的方法里面调用这个接口的方法。最后在UI类中定义这个接口方法的具体实现。这样,当模块类执行到相应方法的时候,就会调用 UI 类中的具体实现。

MyListener.java

public interface MyListener {
    // you can define any parameter as per your requirement
    public void callback(View view, String result);
}

MyButton.java

public class MyButton {
    MyListener ml;

    // constructor
    MyButton(MyListener ml) {
        //Setting the listener
        this.ml = ml;
    }

    public void MyLogicToIntimateOthers() {
        //Invoke the interface
        ml.callback(this, "success");
    }
}

MyActivity.java

public class MyActivity extends Activity implements MyListener {
   @override        
   public void onCreate(){
        MyButton m = new MyButton(this);
   }

    // method is invoked when MyButton is clicked
    @override
    public void callback(View view, String result) {   
        // do your stuff here
    }
}

当执行MyButton 中方法MyLogicToIntimateOthers 的时候,就会调用 MyActivity 中的 callback,参数就是 MyButton 和 "success"。实际使用中 MyLogicToIntimateOthers 这种函数经常会放到多线程的 run() 中来执行。

参考: https://*.com/questions/994840/how-to-create-our-own-listener-interface-in-android/18585247#18585247
https://www.jianshu.com/p/e2b71caf45ee
https://blog.csdn.net/uljisang/article/details/71340301

13. 当 build 的时候,提示 Failed to delete some children. This might happen because a process has files open or has its working directory set in the target directory. 有可能是使用了 as 自带的 terminal 窗口,并且打开了相应的目录,只需要在 相应的命令行里面 exit 几下,推出目录即可。

14. 抓取log,可以使用含有 adb.exe, adbwinapi.dll, adbwinusbapi.dll 的软件,比如说 platform-tools-latest-windows.zip,或者鲁大师都可以。使用命令行打开目录到 adb.exe 的位置,然后使用 adb devices 命令查看链接的设备,使用 adb shell 进入 adb模式,使用 logcat -v time >/etc/1.log 来开始保存 log,ctrl+c 停止保存 log,logcat -c 清除日志。向手机传文件,使用 adb push c:\hosts /etc/。从手机传文件,使用 adb pull /etc/hosts c:。

参考:https://blog.csdn.net/u010323805/article/details/78091123
参考:https://blog.csdn.net/dodod2012/article/details/80824395

15. 串口 native 驱动方法的时候,可以参考两篇文章关于串口参数的。

http://man7.org/linux/man-pages/man3/termios.3.html
https://blog.csdn.net/guo_wangwei/article/details/1102931#

16. consider adding at least one Activity with an ACTION-VIEW 提示这个警告,只需要在AndroidManifest.xml文件中,至少一个activity的intent-filter中添加

17. Consider adding the attribute ‘android:fullBackupContent‘ to specify an ‘@xml‘ resource which configures which files to backup.这个警告,可以 android:allowBackup="false" 来禁止备份。如果要开启备份,那就需要以下工作:

  • 在 AndroidManifest.xml 文件中 application 里添加 android:fullBackupContent 属性,指定一个包含备份规则的 XML 文件。
    android:fullBackupContent="@xml/my_backup_rules"
  • 在 res/xml/ 目录中创建一个名为 "my_backup_rules.xml" 的 XML 文件。
    其中, 元素指定 备份 哪些文件, 元素指定 不备份 哪些文件。

该配置文件的 XML 语法规则如下:(语法规则摘自: 数据存储:数据备份:自动备份)

<?xml version="1.0" encoding="utf-8"?>
 
<full-backup-content>
    <include 
        domain=["file" | "database" | "sharedpref" | "external" | "root"]
        path="string" />
    <exclude 
        domain=["file" | "database" | "sharedpref" | "external" | "root"]
        path="string" />
</full-backup-content>

标签内,你可以定义 元素:

  • 指定要?备份?的 文件 或 文件夹。?
    默认情况下,自动备份几乎包含所有应用程序文件。 如果指定了元素,则系统默认不再包含任何文件,并且仅备份指定的文件。 要包含多个文件,请使用多个 元素。

注意:getCacheDir(),getCodeCacheDir() 或 getNoBackupFilesDir() 返回的目录中的文件总是被排除,即使你尝试包含它们。

  • 指定在?备份?期间要 排除 的 文件 或 文件夹。?
    以下是通常从备份中排除的一些文件:
    Ⅰ. 具有设备特定标识符的文件,由服务器颁发或在设备上生成。 例如,Google Cloud Messaging(GCM)需要在每次用户在新设备上安装您的应用程序时生成注册令牌。 如果旧的注册令牌已恢复,应用程序可能会出现意外。
    Ⅱ. 账户凭证或其他敏感信息。 考虑要求用户在第一次启动还原的应用程序时重新认证,而不是允许在备份中存储此类信息。
    Ⅲ. 与应用程序调试相关的文件,如即时运行文件。 要排除即时运行文件,请添加规则 <exclude domain =“file”path =“instant-run”/>
    Ⅳ. 导致应用超出 25MB 备份配额的大文件。
    注:如果你的配置文件指定了这两个元素,则备份?包含由 元素捕获的所有内容减去 元素中命名的资源。 换句话说, 优先。

每个元素必须包含以下 2 个属性:
Ⅰ. domain:指定资源的位置。?
此属性的有效值包括以下内容:

  • root:存储属于此应用程序的所有私有文件的文件系统上的目录。
  • 文件:由 getFilesDir() 返回的目录。
  • 数据库:由 getDatabasePath() 返回的目录。使用 SQLiteOpenHelper 创建的数据库存储在此处。
  • sharedpref:存储 SharedPreferences 的目录。
  • 外部由 getExternalFilesDir() 返回的目录。
    注:你无法备份这些位置之外的文件。

Ⅱ. path:指定要从备份中包含或排除的文件或文件夹。 注意:

  • 此属性不支持通配符或正则表达式语法。
  • 您可以使用 "." 引用当前目录,但是,出于安全考虑,您无法引用父目录。
  • 如果指定目录,则该规则适用于目录中的所有文件和递归子目录。

参考:https://blog.csdn.net/u013719138/article/details/79276370

18. Synchronization on a non-final field. 同步的 object 最好是用 final 的。

19. android studio 不用 e.printStackTrace();使用 Log.e(TAG,Log.getStackTraceString(e)) 来打印异常。

android 学习笔记

上一篇:Vessels


下一篇:Web前端性能优化总结——如何提高网页加载速度