目录
2,Android RecyclerView 去掉滑动边缘阴影效果
3,Android的gradle中implementation和provided的区别
5,https://dl.bintray.com 服务器504找不到
6.android 8.0以上通过adb发送广播,-n指定包名和类名
12,Android如何实现点击一次返回键返回桌面而不是退出应用
1,imageview设置透明度
其中参数 alpha 为透明度,数值越大越清晰~
setAlpha 参数是float,值的范围0---1(因为是小数嘛,所以0-1就够表示了)已过时
setImageAlpha 参数是int,值的范围0---255(整数大着呢,最大取到255)
2,Android RecyclerView 去掉滑动边缘阴影效果
recycleView.setOverScrollMode(View.OVER_SCROLL_NEVER);
3,Android的gradle中implementation和provided的区别
provided只提供编译支持,但是不会写入apk,implementation对于使用了该命令编译的依赖,对该项目有依赖的项目将无法访问到使用该命令编译的依赖中的任何程序,也就是将该依赖隐藏在内部,而不对外部公开
4,applicationId与包名的区别
applicationId默认是和项目的包名一致的。所以常常有开发者会将两者混淆,以为它们是一个概念。实际上,应用ID和包名是相互独立的。改变包名不会影响应用ID,反之亦然。
通常Android的应用ID与包名是绑定的,所以在Android API中,一些方法和参数从名称上看似乎它们返回的是包名,事实上它们返回的是应用ID值.例如,Context.getPackageName()方法返回的是应用ID,而不是包名。
5,https://dl.bintray.com 服务器504找不到
托管平台 Binary 被关闭了,所以无法下载,把http://dl.bintray.com换成https://repos.spark-packages.org完美解决
6.android 8.0以上通过adb发送广播,-n指定包名和类名
adb shell am broadcast -a com.alibaba.receiver.lbslimits -es package com.alibaba.ailabs.autobot
或者
adb shell am broadcast -a com.alibaba.receiver.lbslimits -n com.alibaba.ailabs.autobot/com.alibaba.receiver.LbsLimitsReceiver
7,设置 Dialog 周围的颜色
getWindow().setDimAmount(0.8f);
8,自定义view的Toast屏蔽
出于安全方面的考虑,同时也为了保持良好的用户体验,如果包含自定义视图的toast消息是以 Android 11 为目标平台的应用从后台发送的,则系统会屏蔽这些消息框。请注意,仍允许使用文本消息框;此类消息是使用Toast.makeText()创建的,并不调用setView()。
如果您的应用仍尝试从后台发布包含自定义视图的toast消息,系统会在 logcat 中记录以下消息:
W/NotificationService: Blocking custom toast from package <package> due to package not in the foreground。
Android 11对应api30上,当app处于后台时无法弹出自定义toast view,只能弹出原生的toast,11以下不受影响
9,获取真实的屏幕分辨率
常用的获取设备屏幕分辨率的方法如下:
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
int widthPixels = displayMetrics.widthPixels;
int heightPixels = displayMetrics.heightPixels;
但是这样获取的屏幕分辨率往往跟手机官网的分辨率有偏差,主要是因为状态栏和导航栏的原因,如果想获取真实的屏幕分辨率需要通过如下方式去获取:
DisplayMetrics displayMetrics = new DisplayMetrics();
WindowManager windowMgr = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
windowMgr.getDefaultDisplay().getRealMetrics(displayMetrics);
int widthPixels = displayMetrics.widthPixels;
int heightPixels = displayMetrics.heightPixels;
10,正在使用的Android Studio界面主题
- 1.打开Android Studio设置窗口
- 2.在左边面板中选择Plugins
- 3.点击Browse repositories,搜索 Material Theme UI
- 4.点击Install plugin,安装插件
- 5.重启Android Studio。
11,跨进程开启service
A-app拉起B-app的service
1,B-app在未启动的情况下,只能开启Activity,如果通过start方式开启Services,不然就会报如下错误:
Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.example.myapplication/.IpdlService }: app is in background uid UidRecord{434b5ca u0a523 CEM bg:+10m27s438ms idle change:idle procs:1 seq(0,0,0)}
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1795)
at android.app.ContextImpl.startService(ContextImpl.java:1740)
at android.content.ContextWrapper.startService(ContextWrapper.java:738)
at android.content.ContextWrapper.startService(ContextWrapper.java:738)
at com.example.lunchapp.MainActivity.onCreate(MainActivity.java:70)
at android.app.Activity.performCreate(Activity.java:8198)
at android.app.Activity.performCreate(Activity.java:8182)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
此时只能通过bindservice的方式,自测可以拉起,但是bind下B-app的service生命周期跟随A-app,A-app destroy,B-app的service就会unbind,此时可以start和bind同时使用:
try {
Intent intentJarvisd = new Intent();
intentJarvisd.setClassName("com.example.myapplication", "com.example.myapplication.IpdlService");
ServiceConnection ddd = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
bindService(intentJarvisd, ddd, BIND_AUTO_CREATE);
startService(intentJarvisd);
}catch (Exception e){
Log.i("IpdlService", "onCreate: "+e);
}
2,app启动的情况下,无论start还是bind都是可以拉起的.需要将B-app的service设置export=true
12,Android如何实现点击一次返回键返回桌面而不是退出应用
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { Intent home = new Intent(Intent.ACTION_MAIN); home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); home.addCategory(Intent.CATEGORY_HOME); startActivity(home); return true; } return super.onKeyDown(keyCode, event); }
13.textview设置字体的方式
1.通过theme统一配置,这种方式配置后整个app都会生效
<item name="android:fontFamily">@font/mying_bold</item>
2.textview单独属性配置,只针对单一的textview
android:fontFamily="@font/mying_bold"
3.单独设置typeFace
Typeface tf04 = Typeface.createFromFile(new File("/system/fonts/NotoSansTelugu-Bold.ttf"));
tv04.setTypeface(tf04);
14.android 8.0后台应用开启服务
1.开启前台服务
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(intentJarvisd);
} else {
context.startService(intentJarvisd);
}
2.开启权限
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
3.开启服务
startForeground(FOREGROUND_NOTIFICATION_ID, notification);
15.Gradle build 报错:Received status code 400 from server: Bad Request
不管你如何更改gradle版本,androidstudio一直提示Received status code 400 from server: Bad Request,手动打开网站是可以下载的.原因是此前你配置过代理,在.gradle中有了代理配置
解决如下:
16.bindServer时onServiceDisconnected 和DeathRecipient区别
Binder是可能意外死亡的,这往往是由于服务端进程意外停止导致的,此时我们需要重新连接服务。
1、给Binder 设置DeathRecipient 监听,当Binder 死亡时,我们会收到 binderDied 方法的回调,在 binderDied 方法中我们可以重新绑定远程服务
2、在onServiceDisconnected 中重连远程服务
这两种方法的区别在于:onServiceDisconnected 在客户端的 UI 线程中被回调,而 binderDied 在客户端的Binder 线程池中被回调,即在binderDied 方法中我们不能访问 UI
17.调用android LocationManager获取定为时应注意的问题
1.getLastKnownLocation返回null
原因是因为这个方法是获取上一次定位的location,如果之前没有定位过,返回的就是null,此时需要requestLocationUpdates
2.requestLocationUpdates没有回调过来
原因是采取了GPS定位的方式,有些设备不支持gps,只能使用网络定位,正确做法如下
Location location = null;
int i = 0;
do {
location = locationManager.getLastKnownLocation(providers.get(i));
locationManager.requestLocationUpdates(providers.get(i), 1000, 0,
locationListener);
i++;
}while(location == null && i<providers.size());
18.adb shell发送json数据
adb shell发送基本数据类型可以通过-e 发送string,--ei发送int等,但是如果发送json数据通过-e发送例如:
adb shell am broadcast -a com.demo.test.SEND_SIGNAL -f 0x01000000 -e uri "signal://libBroadcastSignal/aiengine.mock.travelling_status" -e "params" '{"cardType":10}'
会报json解析失败的错误,原因是因为收到广播后会自动去掉‘’导致解析失败
解决办法:
先执行adb shell ,在执行对应的命令,这样就能发送json数据了
adb shell
$ am broadcast -a com.demo.test.SEND_SIGNAL -f 0x01000000 -e uri "signal://libBroadcastSignal/aiengine.mock.travelling_status" -e params '{"cardType":10}'
19.bind aar服务
在bind aar中服务时一直返回false,要注意bind时的包名不是aar所在的包名,而是当前app的包名,AAR里的Service实际上是作为当前app里面的组件在运行了,所以参数要给当前app的packageName