2017-06-22 遇到的一点小问题
今天进入百度地图的定位界面,在用getApplication()).getLocationService()
获取全局locationService时
,会出现对话框提示运行失败,而且定位功能也无法使用。但是应用却没有闪退。错误日志如下:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: 包名:remote, PID: 31363
java.lang.RuntimeException: Unable to create application 包名.DemoApplication: java.lang.NullPointerException
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4535)
at android.app.ActivityThread.access$1500(ActivityThread.java:142)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1273)
t android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5241)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:818)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at 包名.ease.EaseClient.init(EaseClient.java:29)
at 包名.DemoApplication.onCreate(DemoApplication.java:81)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1008)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4532)
at android.app.ActivityThread.access$1500(ActivityThread.java:142)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1273)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5241)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:818)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
at dalvik.system.NativeStart.main(Native Method)
```
加入的环信SDK后才会出现这问题,错误也是因为环信初始化产生的。
打日志看下,原来在定位时重复进入了`Application`的`onCreate()`方法。正常的话,只在应用初始化时进入一次。
错误日志的关键词是**Process**,网上搜了下,相关文章很多。
```
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"/>
```
![android:process](http://upload-images.jianshu.io/upload_images/2286722-7b2485219683dbf7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
原来`AndroidManifest.xml`里的**android:process**参数可以将service组件设置为一个独立进程,进程名就是包名加android:process里的参数但同时也会重新执行android:process。
网上找了下很多文章写到如何防止onCreate()重复执行,隔了一天,懒得再找链接贴上,就贴一下我的代码。
主要方法就是获取当前Process的名称,如果不是自己想要的,就直接return 掉。
```
private String getProcessName(Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
if (runningApps == null) {
return null;
}
for (ActivityManager.RunningAppProcessInfo proInfo : runningApps) {
if (proInfo.pid == android.os.Process.myPid()) {
if (proInfo.processName != null) {
return proInfo.processName;
}
}
}
return null;
}
```
试了下,没问题了,不会提示运行失败,也能正常定位了。
.
.
.
#2017-06-15 遇到的一点小问题
闲逛,刚好看到[Android实现图片相似度](http://zzimoo.com/similar/),这个[汪建军的博客](http://zzimoo.com/)还不错,确实是行动派,将[阮一峰的网络日志](http://www.ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html)里面的理论,用java代码写出来了。很有帮助。
看了下其它几篇,先记录一些新的小发现,都是测试通过的。
######用代码触发一个点击事件的代码:view.performClick();
######context参数不止可以填this或者Main.this还可以写view.getContext();
######启动activity添加 android:launchMode="singleTask" 的话,不管之前是哪个界面,每次home键切出重进都会启动
```
<activity android:name=".MainActivity"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
```
######gradle保持最新版本(latest.integration)
例:`compile 'com.umeng.analytics:analytics:latest.integration'`