buder

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 获取字符串资源:

this.getString(R.string.hello)

 

从 Context 获取字符串资源:

context.getString(R.string.hello)

 

从 Application 获取字符串资源:

application.getString(R.string.hello)

 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);

  

posted on 2017-08-28 09:40  buder  阅读(178)  评论(0编辑  收藏  举报

导航