20170828工作日记
1.Messenger的使用以及原理理解,使用的博客:
Android的进阶学习(五)--Messenger的使用和理解 http://www.jianshu.com/p/af8991c83fcb
Android 基于Message的进程间通信 Messenger完全解析 http://blog.csdn.net/lmj623565791/article/details/47017485#quote
2.Android 中从res/values/strings.xml中读取具体的字符串的方法
在xml中获取strings.xml的值非常简单,有些情况下我们需要在Java代码中获取strings.xml中的字符串的值。尽量将字符串定义在strings.xml是一种非常好的习惯,可以使以后的维护变得方便快捷,同时也避免了程序代码中充斥着过多写死的字符串常量的情况,使程序更加简洁干练。
在Activity的子类中获取string.xml的值方法如下:
1 String value = this.getString(R.string.XXX);
2 //或者是:
3 String value=this.getResources().getString(R.string.XXX);
如果在其他普通java类【未继承Activity的类】中,则要注意,先声明一个Context对象context或者Application类的对象application,
然后:
1 String value = context.getString(R.string.XXX);
2 //或者
3 String value = application.getString(R.string.XXX);
有些情况下因为java类与Activity的子类不在同一个包中,所以R.string.XXX会报错,这时需要引入继承了Activity的类所在的包。
例如:
String privateLocation =context.getResources().getString( com.wang.Activity.R.string.privateDataStoreLocationFileName); String commLocation=application.getResources().getString( com.wang.Activity.R.string.commDataStoreLocationFileName);
往往第二种情况比较常见,所以记住如果是在其他没有继承Activity或者位于其他包中的普通java类中引用strings.xml中字符串的值,就需要采取
context.getResources().getString(Activity所在的包.R.string.XXX) 或者
application.getResources().getString(Activity所在的包.R.string.XXX)的方法
来获取。
正确的方法:
String mess = getResources().getString(R.string.mess_1);
字符串资源的定义
文件路径:res/values/strings.xml
字符串资源定义示例:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello!</string>
</resources>
字符串资源的调用
在 Layout XML 调用字符串资源:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
在 Activity 获取字符串资源:
从 Context 获取字符串资源:
从 Application 获取字符串资源:
3.启动service必须显式声明,
有些时候我们使用Service的时需要采用隐私启动的方式,但是Android 5.0一出来后,其中有个特性就是Service Intent must be explitict,
也就是说从Lollipop开始,service服务必须采用显示方式启动。android源码是这样写的(源码位置:sdk/sources/android-21/android/app/ContextImpl.java):
1 private void validateServiceIntent(Intent service) {
2 if (service.getComponent() == null && service.getPackage() == null) {
3 if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP) {
4 IllegalArgumentException ex = new IllegalArgumentException(
5 "Service Intent must be explicit: " + service);
6 throw ex;
7 } else {
8 Log.w(TAG, "Implicit intents with startService are not safe: " + service
9 + " " + Debug.getCallers(2, 3));
10 }
11 }
12 }
在写代码时今天遇到了这样的报错:
解决方法是需要显式启动service服务:
方法:
设置Action和packageName:
Intent mIntent = new Intent(); mIntent.setAction("XXX.XXX.XXX");//你定义的service的action mIntent.setPackage(getPackageName());//这里你需要设置你应用的包名 context.startService(mIntent);