Jetpack MVVM Android 业务架构一览图分享

感谢小伙伴们实事求是的交流,经过长达 2 年的互动和演化,本示例项目的架构流程已基本确立,

此处分享一份架构流程图,感兴趣可自行保存和查阅。

架构 一览 流程图 mvvm8 条回复 • 2021-08-27 17:18:44 +08:00
KunMinX 1
KunMinX 4 天前
经过我们的调研,70% 以上的公司仍在使用 java 开发或维护项目,而 java 项目又是 “null 安全一致性问题” 高发的场景,因而关于 Jetpack MVVM,我们专注且只分享 java 语言背景的案例,

kotlin 如今官方推广已有 4 年,有条件请及早上车 kotlin,以及尝试 compose 等框架。
huangshengjie 2
huangshengjie 4 天前
好家伙,我在 V2 学 Android !
glovebx 3
glovebx 3 天前
新项目不建议用 LiveData,Flow 是正道
ParfoisMeng 4
ParfoisMeng 3 天前
Google 的更新迭代属实迷糊(狗头
KunMinX 5
KunMinX 3 天前 ❤️ 2
自从上周 google 在播客中提到 “flow 是否会取代 liveData”,之后各种关于 “LiveData 被下岗” 的人云亦云不*于耳,

事实上,Flow 在处理 “表现层” 逻辑及 “页面间通信” 逻辑时的表现糟糕透顶,至少目前来看完全不足以胜任这方面的精细化定制需求,

flow 本来就是操作业务数据的工具,硬生生为其加入 state 等表现层的概念,试图通过 repeatOnLifecycle 等半生不熟的函数来取代 LiveData 在这方面的工作 …

个人预计 “将 flow 用于改变 UI 状态和页面间通信” 的设计,至少 1 年内都不足以演化为在线上环境使用。
cenbiq 6
cenbiq 3 天前
我理解的异步 /请求等通通 flow,消息传递用 liveData
iovekkk 7
iovekkk 3 天前
好贴,顶大佬
bugmaker233 8
bugmaker233 2 天前
@glovebx flow 配合 livedata 使用美滋滋,怎么就不建议了

Android 中状态栏、标题栏、View的大小及区分

Android 中状态栏、标题栏、View的大小及区分

1、获得状态栏的高度(状态栏相对Window的位置):

Rect frame = new Rect();

getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);

int statusBarHeight = frame.top;

2、获得mView中显示内容的Top (不包括标题栏,指的是相对Window的位置,即:没有标题栏的时候,指的是状态栏的bottom在Window中的坐标;有标题栏的时候指的是标题栏的bottom在Window中的坐标)

getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();

3、获得view中显示内容,与window无关,只和父控件有关

如果布局文件中mView match_parent 那么top=0,bottom=mView.getHeight();

4、获得屏幕的宽高:

(1)

getResources().getDisplayMetrics().heightPixels;

getResources().getDisplayMetrics().widthPixels;

(2)

WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
int width = wm.getDefaultDisplay().getWidth();//屏幕宽度

int height = wm.getDefaultDisplay().getHeight();//屏幕高度

(3)

DisplayMetrics mDisplayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);
int W = mDisplayMetrics.widthPixels;
int H = mDisplayMetrics.heightPixels;

(4)过时方法

Display mDisplay = getWindowManager().getDefaultDisplay();
int W = mDisplay.getWidth();
int H = mDisplay.getHeight();

2021了,Android程序员的出路是怎么样的呢

2021 了,技术日新月异,频频忙于业务无法提升,比较迷茫于 android 前景和出路,有没有前辈大佬指点一下

16 条回复    2021-08-25 19:42:01 +08:00

alexkkaa
    1

alexkkaa   19 小时 23 分钟前 via Android

迟早步桌面软件的后尘。web 才是王道。 我的安卓机子一年装不了两三个软件。
janus77
    2

janus77   18 小时 27 分钟前

转音视频
转大前端
研究黑科技 /底层技术
acidsweet
    3

acidsweet   18 小时 21 分钟前   ❤️ 2

也算是多年从业者,勉答一下:
1. 只会做基础 UI\框架\业务的出路越来越少,毕竟移动互联网尾声了、 客户端基础设施都很完善了,特别是小程序生态大力挤压了客户端的开发需求;而且国内外创业环境也不好,从零开始做 app 的需求已经很小了。
2. 基础技术上的需求应该会一直存在,比如 ANR 的监控和处理、OOM 的监控和处理等等稳定性方向的需求一定是一直存在的,但是需求量也就那样,毕竟这方面的框架也无比成熟了(我就是在这条线趴着)
3. 某个具体应用方向,*典型的是多媒体音视频方向的;得益于短视频的兴起,这方面的需求这两年还是挺旺盛的,就是不确定现在入场是否赶趟;此外还有 AR\端智能等等
——–
*后我个人的看法是客户端的确有点大势已去的意思,如果已经成为资深开发者可以扛着,毕竟后续新的入门者会越来越少;如果是初级玩家的确要掂量一下自己投身进来是否能在做不大的蛋糕上划拉一块下来
mjawp
    4

mjawp   17 小时 19 分钟前

隔壁 iOS 已经躺的差不多了。早就没人问这个问题了
FATEQiang
    5

FATEQiang   17 小时 18 分钟前

Android 挺好的,高级的 Android 是真的比较缺。很多人都认为 Android 就是写写三方 app 发布出去那种需要用户下载的桌面软件啥的,其实不是这样的。Android 真的不止于此,但是也没有要求一定要好高级好高级的黑科技才有出路。就本人的经验看,现在我们这边很缺这方面的 Android 开发:1 、系统应用,就基于原来 AOSP 演变的 ROM,甚至基于鸿蒙的系统应用,系统应用真的比三方应用难太多,架构复杂太多太多,主要是模块、底层服务的耦合; 2 、偏 framework 层(这个太缺了,之前在干系统应用开发的时候都被其他公司邀请干这个)
FATEQiang
    6

FATEQiang   17 小时 15 分钟前

2021 年了,并不是 Android 不行了,是 Android 已经逐渐到终端定制了,目前还不会抛弃 Android 开源的威力(定制、裁剪),这边很多业务场景招人:车载、tv 、通信、iot 都有
FATEQiang
    7

FATEQiang   17 小时 14 分钟前

@mjawp 出海应用还是多,ios 也饿不死
preach
    8

preach   17 小时 13 分钟前

楼上说的好,这就是事务发展的趋势啊!
arthas2234
    9

arthas2234   16 小时 53 分钟前

单独的 APP 已经没出路了,都是拼后台,拼资源,APP 只是个壳
我认识有个大哥去做车载系统了,还是很吃香
wiwby
    10

wiwby   16 小时 31 分钟前

@mjawp 我已经找了个养老单位躺好了哈哈哈

murmur
    11

murmur   16 小时 29 分钟前

安卓必须精,必须底层,简单的应用被小程序和大厂蚕食了,单纯为了做 app 学安卓不值
NewTab12138
    12

NewTab12138   16 小时 25 分钟前

安卓只是趋于稳定了,并不是大势已去,高级开发者仍然不用担心,只是现在选择入门安卓的就要考虑考虑了
cnnbboy
    13

cnnbboy   16 小时 15 分钟前

我的感受而言就是,新进来的人少了,说实话,反而内卷少了不少,大厂客户端也很容易进了,对还在留这个领域的技术人员都算是好消息。
ArJun
    14

ArJun   16 小时 0 分钟前

安卓需求还是比 ios 多不少,现在找工作还是容易
silencelixing
    15

silencelixing   15 小时 26 分钟前

真不知道出路在哪里,不过我想做大前端是真的
122006
    16

122006   13 小时 35 分钟前

人机交互界面(也就是和硬件对接),这一块是安卓开源特性无可替代的部分
趴着

Android BroadcastReceiver 注册和反注册

Android BroadcastReceiver 注册和反注册

说起来这个问题很简单,只要注册和反注册成对出现就行,好像很多教材都是如此介绍。但实际开发中,对广播注册和反注册的时机把握还是很重要的。

关于广BroadcastReceiver注册和反注册时机,主要有以下几点:

onCreate – onDestroy(即便页面未显示,仍然能接受广播)
onResume – onPause(即只有页面显示时,才能接受广播)
onStart – onStop

https://stackoverflow.com/questions/21136464/when-to-unregister-broadcastreceiver-in-onpause-ondestroy-or-onstop

 

当注册广播时,常会遇到的问题就是重复注销广播处理函数是会报错,而且会让进程奔溃。一般来说,可以通过一个变量来保存广播处理是否被注销,每当注销时,将它标记为false。如果再次注销时遇到false就不对他进行注销处理。

曾经我遇到过几次异常,提示我的BroadcastReceiver多次被反注册,导致系统异常死掉。废了很长时间查看代码找原因。。

比如我之前常在finish方法中反注册广播,但finish方法有可能被多次调用,导致 BroadcastReceiver多次被反注册。

另外,需要注意一点,你用什么contex(上下文)注册的广播,则必须用它来反注册。

比如你调用getApplicationContext()注册,用getApplicationContext()删除。而不能直接unregisterReceiver(mFinishReceiver);和registerReceiver(mFinishReceiver, filter);有可能找不到。

目前安卓各个 ui 的应用抽屉好用吗

目前安卓各个 ui 的应用抽屉好用吗

 

archiyuan · 1 天前 · 1017 次点击

  • oppo 和小米都没办法使用第三方桌面,oppo 第三方桌面没法设为默认总是自动退出,小米设置第三方为默认后就禁用全面屏手势。
  • oppo 自带桌面没有分类,所有应用包括系统应用全堆在一起。小米自带桌面虽然有分类但是但是始终有一栏全部是囊括了所有应用的。
  • 之前用了大半年的氢 os,可以完美设置 nova launcher,所有不常用的应用都可以分门别类的放进抽屉的不同页面,想用的时候也不难找,真的非常舒服。
  • 因此比较好奇三星华为 vivo 魅族或者 pixel 的自带应用抽屉好用吗,以及现在是不是基本都不支持第三方桌面了?

13 条回复    2021-08-18 10:34:12 +08:00

fromzero
    1

fromzero   1 天前   ❤️ 1

魅族不行,设置了第三方桌面后,时不时的还会弹出魅族的桌面。
xloger
    2

xloger   1 天前

MIUI 的应用抽屉烂得不行…用应用抽屉的目的自然是分类,分成一组一组然后一个杂项,可以快速找到自己想要的 App 。结果硬是不能拆分,每个抽屉都是无筛选的,有跟没有一样。*后迫于用自带的分类,连个游戏分组都没有。

当然,*烂的还是努比亚的桌面,没有之一。

zoharSoul
    3

zoharSoul   1 天前

氧 os 的不错
israinbow
    4

israinbow   1 天前

emui 的很好用.
TheBlade
    5

TheBlade   23 小时 49 分钟前

one ui 支持第三方启动器, 但是我个人更喜欢 one ui 本身+good lock 套件
archiyuan
    6

archiyuan   23 小时 28 分钟前

@zoharSoul 已经是历史了,也不知道还能活多久
archiyuan
    7

archiyuan   23 小时 20 分钟前

@xloger miui 这个确实,看着好像好用,实际用起来挺难受的
archiyuan
    8

archiyuan   23 小时 17 分钟前

@TheBlade good lock 套件可以自定义应用抽屉吗?之前短暂体验过 oneui,息屏、多任务样式什么的,调了半天总是很违和就出掉了
TheBlade
    9

TheBlade   22 小时 2 分钟前

@archiyuan one ui 只有传统的 apps screen, 默认关闭状态, 也没有类似 ios app library 的应用自动分类需要用户手动分类建立文件夹, 挺烂的
noahhhh
    10

noahhhh   21 小时 35 分钟前

Android 10 和 11 把 gesture 和 launcher 整合在一起了,一般机子只有靠刷 magisk 模块才能完美实现桌面和手势更换。
可以看下这篇做参考 https://www.xda-developers.com/third-party-launchers-animation-pixel-phones/

archiyuan
    11

archiyuan   21 小时 14 分钟前

@noahhhh 好的,谢谢。
FaneLau
    12

FaneLau   3 小时 36 分钟前 via Android

应用抽屉是说文件夹对吧?我用 Pixel,Android 11,系统没有自动分类文件夹的功能,需要自己在桌面建立,我试了下把 fb 的图标拉到 tg 的图标上覆盖住,会自动生成名为 Chat 的文件夹,但是靠自己整理太费事了,我有 200 多个 app,只把*常用的放桌面。Play 商店上有一个软件叫 Smart Sort Launcher,我用这个来自动归类我的 app,但我不将它设置为默认的 launcher,只是偶尔有些不常用的 app 但又想不起名字比较难找的时候,才会点进去 Smart Sort Launcher 里,根据目标软件的功能去对应的文件夹里面找。另外我设置了一个 Smart Sort Launcher 的快捷键在主屏,点击的时候会弹出来一个 26 位英文键盘,可以用来搜索联系人或 app,比如搜索张三的话直接打 zs 两个字母就可以了,搜索云闪付的话打 ysf 几个字母,它就会在键盘位上方显示对应的联系人或 app 图标,很方便,事实上我已经把这个快捷键替换掉我原来的 Home 键了。如果说不借助第三方应用的话,Android 11 本身主屏*下方有个 Search Bar (搜索框), 点击展开可以搜索相关词语会显示对应的网页搜索推荐以及本机 app 名称,比如搜索 “YouTube”,他会显示我手机上安装的 YouTube 和 YT Music 这两个;我搜索 “微信”,他会显示出 Wechat,搜中英文应用名都能得到对应结果。以上可能有些术语用得不是很准确,我尽量表达得清楚了。
wsrlyk
    13

wsrlyk   2 小时 37 分钟前

目前为止还是一加桌面用起来舒服。
常用应用直接放桌面。
不常用应用根本不用管分类,桌面上滑 打开所有应用抽屉并自动打开九宫格键盘,输入首字母即可筛选出包含该首字母的应用。比如连敲 3 个 9,就可以筛选出网易云音乐(wyyyy)。
页面上方也有自带的一些分类可以点,虽然我没怎么用过,都是直接搜的。
抽屉里的应用列表 还会按搜索频率排序,搜过多次的应用在*前面,直接开就行。只需要搜那种一年开一次的家伙,什么所得税啥的

缺点就是 名字比较短的应用比如 qq,只能敲 2 个数字,筛选出的重码结果会相对比较多,要稍微找找。但既然已经是不常用应用了,影响不大

悬浮窗 权限

悬浮窗 权限

/**
 * 判断是有悬浮框权限
 * @return
 */
public static boolean canDrawOverlays(Context context) {
  try {
    return Settings.canDrawOverlays(context);
  } catch (NoSuchMethodError e) {
  }
}
/**
 * 判断是否缺少权限
 * @param permission
 * @return
 */
public static boolean checkSelfPermission(String permission) {
  return ContextCompat.checkSelfPermission(ApplicationContext.getInstance(), "android.permission.SYSTEM_ALERT_WINDOW") ==
      PackageManager.PERMISSION_GRANTED;
}


public static boolean checkPermission(String permission) {

  return (PackageManager.PERMISSION_GRANTED ==
      ApplicationContext.getInstance().getPackageManager().checkPermission("android.permission.SYSTEM_ALERT_WINDOW", ApplicationContext.getInstance().getPackageName()));

}


/**
 * 4.4 以上可以直接判断准确
 *
 * 4.4 以下非MIUI直接返回true
 *
 * 4.4 以下MIUI 可 判断 上一次打开app 时 是否开启了悬浮窗权限
 *
 * @param context
 * @return
 */
//OP_SYSTEM_ALERT_WINDOW=24   op = 24
public static boolean checkOp(Context context, int op) {
  final int version = Build.VERSION.SDK_INT;

  if (version >= 19) {
    AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
    try {

      Class<?> spClazz = Class.forName(manager.getClass().getName());
      Method method = manager.getClass().getDeclaredMethod("checkOp", int.class, int.class, String.class);
      int property = (Integer) method.invoke(manager, op,
          Binder.getCallingUid(), context.getPackageName());

      if (AppOpsManager.MODE_ALLOWED == property) {
        return true;
      } else {
        return false;
      }
    } catch (Exception e) {

    }
  } else {

  }
  return true;
}


/**
 * 判断 悬浮窗口权限是否打开
 *
 * @param context
 * @return true 允许  false禁止
 */
public static boolean getAppOps(Context context) {
  try {
    Object object = context.getSystemService("appops");
    if (object == null) {
      return false;
    }
    Class localClass = object.getClass();
    Class[] arrayOfClass = new Class[3];
    arrayOfClass[0] = Integer.TYPE;
    arrayOfClass[1] = Integer.TYPE;
    arrayOfClass[2] = String.class;
    Method method = localClass.getMethod("checkOp", arrayOfClass);
    if (method == null) {
      return false;
    }
    Object[] arrayOfObject1 = new Object[3];
    arrayOfObject1[0] = Integer.valueOf(24);
    arrayOfObject1[1] = Integer.valueOf(Binder.getCallingUid());
    arrayOfObject1[2] = context.getPackageName();
    int m = ((Integer) method.invoke(object, arrayOfObject1)).intValue();
    return m == AppOpsManager.MODE_ALLOWED;
  } catch (Exception ex) {

  }
  return false;
}

 

另一种思路实现类似冰箱、黑阈的功能

Android 上实现不 root 管理其他 App,基本上有几种方案:

  1. 利用设备管理员模式。代表应用 App Ops/小黑屋。
  2. 利用 Adb 调试权限。代表应用 冰箱 /黑阈。
  3. 另有一派非主流,利用无障碍服务,模拟点击杀进程。如KillApps。

对我个人来说,设备管理员模式的操作过于复杂,而且有相当一部分设备不支持。主要研究了一下 Adb 模式。

冰箱 /黑阈在非 root 情况下,需要用户在每次设备重启后用 adb 运行一个脚本,这个脚本在后台起一个有 adb 权限的进程。后面需要 adb 权限时,通过 socket 和这个进程通信,利用它的 adb 权限代替执行相关操作。

但其实原生 Android 上已经有一个进程在做一模一样的事,那就是 adbd 。

熟悉 Adb 调试的人都知道,adb 调试是通过 PC 端的 adb 命令程序和 Android 设备端的 adbd 服务进程通信实现的。不管底层是走 usb 还是 tcpip,他们之间交互的协议是固定的。

那么能不能在设备端实现一个 adb 命令程序,实现在设备上对其他 App 的管理呢。

答案是肯定的,Adb 协议相当简单明了,实现并没有太大难度。https://android.googlesource.com/platform/packages/modules/adb/+/HEAD/protocol.txt

这样一来,App 获取 ADB 权限流程变成:

1.开启 adb 调试,连上设备,执行: adb tcpip 5555

2.App 中连接 localhost 的 5555 端口,发送 adb 调试证书授权,用户点确认,获取 adb 权限。

相比于冰箱 /黑阈,这个方案的好处是,利用的是 Android 官方的 adbd,后台没有任何第三方进程,不使用 App 时系统零开销。 安全性,稳定性更有保障。

利用这个原理,我写一个 App,有兴趣的 tx 可以试用一下

Ran: Rule your Apps with Adb on devices

https://play.google.com/store/apps/details?id=com.cloudmonad.ran

目前功能比较简陋,主要利用 adb 权限实现了 获取 App 运行状态,杀死 App,frozen/unfrozen(利用 pm disable/enable )

17 条回复    2021-07-13 18:02:53 +08:00

44670
    1

44670   26 天前

wifi adb 重启后会保留吗?
Jirajine
    2

Jirajine   26 天前 via Android

你说的这些主流应用,现在就是这样做的啊。Android 11 以上可以直接开启 WiFi adb,之前的需要你先通过有线连接然后开启,重启后仍然会重置。
另外 shizuku 这种服务的目的是为了能够直接使用 Java api,而不是只能用 shell 命令。
cache
    3

cache   26 天前

@44670 不能,每次重启要重新执行一下 adb tcpip 命令
cache
    4

cache   26 天前

@Jirajine 具体哪个是这么做的,至少我测试的时候他们都是起了后台进程。
shizuku 是 root 方案,不在讨论里
AoEiuV020
    5

AoEiuV020   26 天前 via Android

我记得黑域就有支持这种方案,记得是 root, wifi adb, 电脑 adb 都支持的,
Jirajine
    6

Jirajine   26 天前 via Android

@cache 这么做的是指,它们都能在开启了 WiFi adb 的情况下,直接在本地和 adbd 通讯激活。
shizuku 可以用 root 启动也可以用 adb 启动,其他的也一样。这类后台服务*主要的目的是通过 binder 导出 Java API,从而可以直接调用。直接用 adbd 的话,一来只能用 shell 指令非常麻烦,并且在用户 WiFi 断开的情况下就不能操作了。
x2009again
    7

x2009again   26 天前

不知道是不是安卓备份出来的原因,安卓 7 打开闪退,我从一个手机的 google play 下载安装后备份下来然后安装到安卓 7
cache
    8

cache   26 天前

@AoEiuV020
我*早就是从黑域的 adb 激活入坑的

你从 https://brevent.sh/安装后,ps 看一下,有两个 shell 权限后台进程。

另外还有小黑屋的麦克斯韦妖,原理都一样。

Cielsky
    9

Cielsky   26 天前 via Android

安卓 10 才需要运行 ADB tcpip 吧,11 设置里可以直接开启无线调试了
cache
    10

cache   26 天前

@Jirajine
我只测试了官方提供的激活方式

@x2009again 有 adb 日志么

cache
    11

cache   26 天前

@Cielsky adb tcpip 所有版本都支持,通用性好。

Andoid 11 以后 adb 协议增加了 A_STLS 命令,理论上不需要电脑就可以完成 adb 授权了。目前还不支持

vk42
    12

vk42   26 天前

@cache 后台是用来执行黑名单的啊,你这个就相当于是手动黑名单了,每次把需要冻的 app 手动执行一遍
cache
    13

cache   26 天前

@vk42 没错,现在只是提供了手动功能

后面也可以起个 Service 做自动清理,不需要自动功能的用户可以关闭,不影响激活

ikas
    14

ikas   25 天前

这种很早就用过了…主要问题还是 adb 的权限远远不够..
cache
    15

cache   25 天前

@ikas 够用就行

adb 权限的好处是可以稳定获取
而能 root 的手机并不是主流

pipilu
    16

pipilu   24 天前

每次得开启 wifiadb,这里有安全隐患,相对于 冰箱 /黑阈,实际还是每次都得执行 adb

如果都是在本机运行,是不是可以虚拟 usb 驱动来连接 adbd ?

cache
    17

cache   24 天前

@pipilu 安全隐患是指什么? *次连接 adb 是有认证弹窗的

都有内核驱动级权限也看不上 adbd 这点权限了吧

请教现在市面上手机, LCD 党购买建议

预算 2000 左右。google 服务是刚需。看到你们都说 k40,但是去实体店看了,屏幕实在是受不了,本身就近视。那屏幕看的眼睛累。

现在用的是 mate20 。内存太小( 64G )。看到 vivo 有款 neo5,870+LCD 屏幕+nfc 。不知道有手持的能用 google 服务么?

另外,小米的刷国际版系统的话,保修还有没?

75 条回复    2021-07-14 15:38:39 +08:00

takeshima
    1

takeshima   26 天前 via Android   ❤️ 1

k30s,有谷歌服务,lcd 屏
gesse
    2

gesse   26 天前

一加?
cydysm
    3

cydysm   26 天前

1# +1 我觉得的缺点就是太重了
XiLingHost
    4

XiLingHost   26 天前

pixel
Cooky
    5

Cooky   26 天前

opengapp 自己装
xunandotme
    6

xunandotme   26 天前

非主力机的话,强烈推荐 unihertz,哈哈,纯净安卓,国际版
Death
    7

Death   26 天前

neo5 还是 oled
neo5 活力版是 lcd,能用 google play
yyyyda
    8

yyyyda   26 天前

荣耀 v20
pipilu
    9

pipilu   26 天前

k30s 刷国际版
令 mate20 出吗
gzf6
    10

gzf6   26 天前 via Android

无码兔

israinbow
    11

israinbow   26 天前

pixel, xperia.

Jim142857
    12

Jim142857   26 天前

Google 全套服务*好用的不是 iPhone 吗 23333
ysc3839
    13

ysc3839   26 天前 via Android

没记错的话小米解锁刷机还是有保修的,即使刷了非官方的系统都有。
banricho
    14

banricho   26 天前

MIUI 不用刷机也能用 Play,直接装就行了
samsa89
    15

samsa89   26 天前

推荐 pixel 的各位是认真的吗,pixel 都是 oled 啊
ysc3839
    16

ysc3839   26 天前 via Android

@banricho 不一定的,得看是否有预装 Play 服务,小米的部分机型是没有预装的。
shoto
    17

shoto   26 天前 via Android

k30 pro 5G 刷国陆版 ,用着很爽.
nosugar
    18

nosugar   26 天前

中亚买德亚的 moto g100,日亚可能有拍照声音,国行叫 edge s,LCD PWM=0,骁龙 870
noqwerty
    19

noqwerty   26 天前 via Android

2000 左右红米 note 10 pro 可以,Google 服务都正常
jadehare
    20

jadehare   26 天前

http://storage.googleapis.com/play_public/supported_devices.html
dicbldicbl
    21

dicbldicbl   26 天前 via iPhone

k30s 其实满足楼主要求,预算更充足可以考虑 10tpro,屏幕更好
dicbldicbl
    22

dicbldicbl   26 天前 via iPhone

ios 的话 11 或者 xr 都行,就是贵一点
code4you
    23

code4you   26 天前

k30s
Wicheol
    24

Wicheol   26 天前

moto edge s
ai277014717
    25

ai277014717   26 天前

vivo 可以用 play 但是不能解锁刷机
Akariiin
    26

Akariiin   26 天前

一打 XZP (
um1ng
    27

um1ng   26 天前

K30s + 1
sevenyangdx
    28

sevenyangdx   26 天前   ❤️ 1

mate20 我觉得还能打啊,nm 扩容又方便(有双卡需求的话,我记得华为现在有官方扩容)
titanium98118
    29

titanium98118   25 天前

@nosugar #18 国行 edge s 能不能刷国外的 ROM?
banjidan
    30

banjidan   25 天前

redmi note9 5g 刚刚安装 google play,成功测试可以下载油管
Mosugar
    31

Mosugar   25 天前

我买了小米 10s
nosugar
    32

nosugar   25 天前

@titanium98118 折腾下还是可以刷的,但是升级有问题,省心还是中国亚马逊上买德亚的 moto g100,价钱加税大概接近国行的两倍
11dad
    33

11dad   25 天前 via iPhone

前阵子亚马逊的 poco x3 pro 还行 除了没有 5G 外
titanium98118
    34

titanium98118   25 天前

@nosugar #32 请问是否有刷机传送门( URL )?想了解一下
JensenQian
    35

JensenQian   25 天前 via Android   ❤️ 1

k30s,lcd 党*近的选择 you 了,海外叫小米 10T
865 和 870 没啥区别
小米刷机保修的
AndyZhuAZ
    36

AndyZhuAZ   25 天前

好像 xz2p 都不需要 2000
JensenQian
    37

JensenQian   25 天前 via Android

也不是保修吧,就是可以去售后免费 9008 刷机,反正高通的机子基本上刷炸的,9008 都救的回来的
你要刷的话刷 eu 好了,钱包问题用国内版提取再刷入就好了
nosugar
    38

nosugar   25 天前

@titanium98118 https://forum.xda-developers.com/f/motorola-moto-g100-edge-s.12173/
fightff
    39

fightff   25 天前 via Android

k30s + MIUI EU 或者其他 ROM
JensenQian
    40

JensenQian   25 天前 via Android

我觉得还是别买外版机子,你刷炸了想 9008 救下,某米的至少还能去售后
Jakarta
    41

Jakarta   25 天前

@jadehare 好像不太准。redmi note 8 pro *新的稳定版已经不支持 play 服务了,但是仍出现在列表里。
JensenQian
    42

JensenQian   25 天前 via Android

现在 2000 左右的 8 系列 LCD 机子就三个
k30s,neo5 活力版,moto edge s
k30s 和 neo5 活力国行都自带 gms,
某米你需要绑定七天才能解锁刷外版
nosugar
    43

nosugar   25 天前

LCD 手机基本快*迹了,iPhone 唯一的几款 LCD 都是因特尔基带,信号定位有点儿拉跨,可以换个思路:OLED 手机+平板电脑。平板好多 LCD 选择,9 月可能出的 iPad mini 6 是一个非常不错的日常携带选择,iPad Pro 2021 11 寸携带起来也还行,再等等会有小米平板 5,以及联想 tab p11 plus 。
JensenQian
    44

JensenQian   25 天前 via Android

@Jakarta note8pro,小米 8 这些旧机子 12.5 国行 miui 是没了,而且还不能自己装不过海外上市的肯定有国际版,国际版自带的,要用的话退回去或者自己刷外版
*近的 k40g,note9,10x 这几个玩意国行本来没有 gms 的后面 12.5 加进去了
反正海外有上市的国行没有的现在整外版,高通的外版都没有的还有 eu
JensenQian
    45

JensenQian   25 天前 via Android

%title插图%num
ToPoGE
    46

ToPoGE   25 天前

@JensenQian 也不要为所欲为,售后保底的方法是通过短接 9008 端口刷回,如果不行主板就废了,这样是不保修的
JensenQian
    47

JensenQian   25 天前 via Android

提醒一句,现在 miui 的 bug 有点多,大 bug 我没怎么遇到,就是小 bug 有点多,你可以试着刷类原生的,缺点就是国内软件压不住,想用国内的软件的话还是国行 miui,反正也是自带 gms,打开应用商店更新 play 就能用了
JensenQian
    48

JensenQian   25 天前 via Android

@ToPoGE 是的
Vegetables
    49

Vegetables   25 天前

Motorola Edge s
xiaohuihuihui616
    50

xiaohuihuihui616   25 天前

K30S 6.18 时候东哥能搞到 1800 左右没舍得下手,没想到还是价格这么硬。
今天中午刚在小米直营店看了 note10 pro,刚好现在天气热阳光强烈,屏幕亮度实在是一言难尽。
不纠结了,东哥家下单 vivo 了。
JensenQian
    51

JensenQian   25 天前

@xiaohuihuihui616 #50 也行,橘子系统挺好用的
JensenQian
    52

JensenQian   25 天前   ❤️ 1

@ToPoGE #46 %title插图%num
changchong
    53

changchong   25 天前

@gesse 一加就算了,一言难尽
JensenQian
    54

JensenQian   25 天前 via Android

@xiaohuihuihui616,neo5 活力版是 lcd,neo5 是 oled
Vindroid
    55

Vindroid   25 天前

要 root 和刷系统的话就只有 k40 是较好的选择了,neo5 刷机和 root 是个大问题
Lemeng
    56

Lemeng   25 天前

小米的新系统不清楚,以前的是可以的,一直在用
sharpy
    57

sharpy   25 天前

我 k20 刷了 pixelexperience
Admin8012
    58

Admin8012   25 天前 via Android

Edge s 刷 LOS 既可
YOKAMIA
    59

YOKAMIA   25 天前

歪个楼,Razer phone2 的屏幕是 LCD 里面*好的,2k+120hz
gmywq0392
    60

gmywq0392   25 天前

LG G5
VENIVIDIVICI
    61

VENIVIDIVICI   25 天前

Redmi k30s 至尊纪念版 (不要用 MIUI 12.5 )
flyingwings
    62

flyingwings   25 天前

g5 确实还行
wtks1
    63

wtks1   25 天前 via Android

我这个就是 neo5,可以 googleplay,有预装框架
ste
    64

ste   25 天前 via Android

Redmi K30S,或者 Mi 10T Pro 。
两者都有很多第三方机型,实际上可以看作同一款机子。机型代码一样的。
类原生的人话,官方 LOS 也有,其他的也有好多。
quxinna
    65

quxinna   25 天前

我用的 sony xperia 5 II,个人觉得 Sony 的设计比较符合我的口味
scleom
    66

scleom   25 天前

Google Pixel 4a.
2400+.
flynaj
    67

flynaj   25 天前 via Android

LCD 只能上米 6 了,除了拍照没有新手机好,其它的都可以
20015jjw
    68

20015jjw   25 天前 via Android

我至今理解不了 oled 瞎眼的说法
S179276SP
    69

S179276SP   25 天前

华为 mate 20,Google 服务稳定
S179276SP
    70

S179276SP   25 天前

@S179276SP 额当我没说
jalen
    71

jalen   25 天前

@Death #7 mtalk.google.com 能正常连接吗?
shelterz
    72

shelterz   25 天前

@S179276SP 手持 mate 20pro,前段时间 google play store 无法下载 app 可把我恶心坏了, *后还是卸载 store 重新安装搞定的。
还遇到过使用某宝买手机卡时无法上传身份证的问题,也是卸载重装某宝解决的。
0747916
    73

0747916   24 天前

这些要求必上 k30s
jerryjhou
    74

jerryjhou   24 天前 via Android

小米主板坏不保,免费 9008 换主板自费。别的毛病正常保修
OV 都自带 GMS 但功能不完整,不能解锁不能 Root 不能刷国际版
sagowave2
    75

sagowave2   24 天前

小米 11u 可以装 google play 不过不是 LCD 屏
en20
    76

en20   23 天前

自用 oppo findx2pro ,自带 google 服务,现在二手应该是 2k 多,屏幕很好,用了一年比 lcd 可强太多了

一直困扰设计师多年的Android 单位 dp

轻松理解Android开发单位DP ,让设计与开发高度匹配,整合了网上各大资料汇总一个通俗易懂的。

一直困扰设计师多年的Android 单位 dp

设计这么多年了,相信很多设计师,一直被DP搞得晕头转向的,因为我们设计常用单位是PX ,设计的时候我们用这个单位,但是开发人员则用dp,如何保证设计的产品效果图,文字能让开发人员,准确还原,这里我们就不得不提sp

%title插图%num

Android 为什么引入dp?

是因为这个世界上存在着很多不同屏幕密度的手机,屏幕密度是什么?就是ppi,就是单位长度里的像素数量。

想象一下,如果这些手机的尺寸一样,屏幕密度相差很大,那么是不是说一个手机水平方向上像素很少,另一个手机水平方向上像素很多?那我们画同样pix数量的时候,它显示的长度不就会不一样了?

比如下图中的两个手机,同时设置2px长度的Button,在屏幕密度较高的手机里就会显示的比较小。

而同时设置的2dp长度的Button,在两个手机上显示的大小是一样的。

%title插图%num

Android常用单位:

1.屏幕尺寸in(英寸):指实际的物理尺寸,为屏幕对角线的测量。一般讲的大小单位都是英寸,比如iPhone5S的屏幕尺寸是4英寸。

%title插图%num

2.像素(pixel):屏幕上的点,基本原色素及其灰度的基本编码。

%title插图%num

3.分辨率(Resolution):是指屏幕上垂直方向和水平方向上的像素个数。(比如iPhone5S的分辨率是1136*640)

%title插图%num

4.dpi:dot per inch,就是每英寸的像素数,也叫做屏幕密度。这个值越大,屏幕就越清晰。

%title插图%num

5. dp=dip : device independent pixels(设备独立像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。

6. sp:Scale-independent pixels,它是安卓的字体单位,以160PPI屏幕为标准,当字体大小为 100%时,1sp=1px。

对ppi 的理解:

ppi= Pixels per inch,每英寸上的像素数数目,即 “像素密度“

屏幕尺寸in(英寸):指实际的物理尺寸,为屏幕对角线的测量。

而ppi的运算方式是:

PPI = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数

举个简单的列子,iphone5的ppi是多少?ppi=√(1136px²+ 640px²)/4 in=326ppi(视网膜Retina屏)

为解决Android设备碎片化,引入一个概念dp,一种基于屏幕密度的抽象单位。

Android把屏幕密度分为了四个广义的大小:

低(120ppi)、中(160ppi)、高(240ppi)和超高(320ppi)

dp是(设备独立像素)不同设备有不同的显示效果,这个和设备硬件有关是虚拟像素,在不同的像素密度的设备上会自动适配。

在每英寸160ppi的显示器上,1dp= 1px。

关于dp与px 单位换算:

dp=dip:device independent pixels(设备独立像素)不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA推荐使用这个,不依赖像素。

dp是一种与密度无关的像素单位,在每英寸160点的屏幕上,1dp=1px

dp和px的换算公式 :dp*ppi/160 =px

比如,在一个240ppi的屏幕里,比如1dp x 240/160 =1.5px。 即 1dp=1.5px,

mdpi(160ppi)  1dp = 1px ;  hdpi  (240ppi)1dp=1.5px;

Xhdpi(320ppi )1dp=2px;    xxhdpi(480ppi )1dp=3px;

%title插图%num

对于设计人员而已,我们要把dp转化为px,  只是需要利用公式:

px=dp*ppi/160

mdpi: 1.0 (baseline)    1dp=px

hdpi: 1.5              1dp=1.5px

xhdpi: 2.0              1dp=2px

xxhdpi3.0                     1dp=3px

把dp 转化为px  公式为:

dp乘以每个密度下面的系数比值

常见手机分辨率:

4:3

VGA       640*180(video graphics array)

QVGA    320*240(Quarter VGA)

HVGA    480*320(half-size VGA)

SVGA    800*600(Supper VGA)

5:3

WVGA  800*480(WideVGA)

 

16:9

FWVGA  854*480(full wide VGA)

HD     1920*1080(high definition)

QHD      960*540

720p     1280*720 标清

1080P     1920*1080  超清

Android 字体单位:

sp:Scale-independentpixels,它是安卓的字体单位,以160PPI屏幕为标准,当字体大小为 100%时,1sp=1px。

Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。

默认系统字体   英文:Roboto;中文:DroidSans Fallback  与微软雅黑很像

%title插图%num

Android L 常用字体边距规格对照表:

%title插图%num

AndroidL 常用字体边距规格对照表:参考资料:

%title插图%num

 

Android 怎么屏蔽 油管广告?

yueme · 21 小时 53 分钟前 via Android · 1049 次点击

下了个 adblock plus,没效果。

18 条回复    2021-08-04 14:37:12 +08:00

Love4Taylor
    1

Love4Taylor   21 小时 45 分钟前   ❤️ 2

YouTube Vanced
gstqc
    2

gstqc   21 小时 44 分钟前   ❤️ 1

买 Youtube Premium ?
whywaoxaks
    3

whywaoxaks   21 小时 43 分钟前   ❤️ 1

买会员
JensenQian
    4

JensenQian   21 小时 11 分钟前 via Android   ❤️ 1

vanced
kumiko
    5

kumiko   21 小时 10 分钟前 via Android

仅限 android 的话,vanced 比比 premium 好用太多
dlsflh
    6

dlsflh   20 小时 55 分钟前 via Android

如何破解 YouTube music 的地区限制?
两个代理都被识别为中国 IP 了。
ruixue
    7

ruixue   19 小时 9 分钟前

@dlsflh 关键词 cloudflare warp ipv6
fangxing204
    8

fangxing204   18 小时 58 分钟前 via Android   ❤️ 1

用手机版 Firefox 装 unlock origin
teruspot
    9

teruspot   17 小时 59 分钟前 via Android

vanced,或者会员
yitingbai
    10

yitingbai   17 小时 49 分钟前

用软路由*+屏蔽广告, 既方便又好用, 还省得在手机上装各种软件, 出门用 4G 还想用的话, 可以用系统 * 连接到家里

 

Yien
    11

Yien   17 小时 38 分钟前

找一個被 Google 認證為大陸區的海外 IP,自帶去廣告功能。

 

KKLeon
    12

KKLeon   17 小时 4 分钟前   ❤️ 1

买会员一年才 40 多块钱,还能无限听或者下载 youtube music 的音乐,多爽。
我原来一直上的会员车,中间不打算继续会员然后下车了几天,然后实在受不了那么多广告,又继续上车了。
会员真香!
hxys
    13

hxys   13 小时 48 分钟前

用 adguard
fateofheart
    14

fateofheart   10 小时 32 分钟前

有钱买会员先。。
或者
vanced 不 root 还要安装 microG 试试 https://newpipe.net/
或者直接手机 firefox 加插件走起
liuhouer
    15

liuhouer   7 小时 44 分钟前 via iPhone

alook 浏览器自带广告屏蔽,打开 YouTube 直接就没广告,比客户端好用的多
HeyYoGirls
    16

HeyYoGirls   5 小时 57 分钟前

我开了印区车 5 块
TheWhiteHouse
    17

TheWhiteHouse   2 小时 36 分钟前

上车!其他说啥都不好使
Andre42
    18

Andre42   1 小时 27 分钟前 via Android

会员这么便宜的是买的淘宝家庭组吗?还是有别的渠道
dyb0204
    19

dyb0204   2 天前 via Android   ❤️ 1

pure tuber
katoyu
    20

katoyu   2 天前

一个月 3.5,解君愁!
codehz
    21

codehz   2 天前 via Android

Premium 现在有 lite 版本,好像只要 60%的价格
CallmeDredd
    22

CallmeDredd   2 天前 via Android

50youtube 。Com

帮你解忧

CallmeDredd
    23

CallmeDredd   2 天前 via Android

@Andre42 一般是印度家庭组
jones2000
    24

jones2000   2 天前

买会员
freechuzhuo
    25

freechuzhuo   2 天前

不用客户端。推荐 brave 浏览器,目前看下来广告去的*彻底。或者 yandex 装 ublock origin 插件,效果也还可以。
CokeMine
    26

CokeMine   1 天前

vanced+1,但是我不知道为什么每次装完好使,过几天就自动变成原版了,Music 没有这个问题
webmasterisadog
    27

webmasterisadog   1 天前 via Android

找 被识别为中国 的 vps,自带去广告。就是有点小贵
jovi1123
    28

jovi1123   1 天前

@CokeMine 是 play store 自动更新了,只能关掉自动更新或者 vanced 改成用 nonroot 模式
greatghoul
    29

greatghoul   23 小时 18 分钟前

我试过买会员,可以的。
Zien
    30

Zien   15 小时 23 分钟前 via iPhone

买 Premium +1