小编Vas*_*liy的帖子

Android架构组件的源代码在哪里?

找不到新的Android架构组件的源代码.它发表了吗?如果是的话,在哪里?

如果源是在AOSP中,请指定我应该使用哪个特定的repo项目repo sync [PROJ_NAME]才能获得它.

android android-source repo android-architecture-components

25
推荐指数
2
解决办法
4294
查看次数

为什么AOSP添加新API以支持库而不将其添加到SDK?

我几个月来一直在为Android开发,这个问题一次又一次地出现:添加全新功能(API)以支持库而没有它们在标准SDK中可用的动机是什么?

例:

FragmentTabHost API仅可通过android.support.v4.app.FragmentTabHost.大部分时间都很好,但是如果你想将片段嵌套和PreferenceFragment一起使用,你就会死在水中 - 嵌套需要你切换到android.support.v4.app.Fragment(支持4.2以下),但是在这里没有PreferenceFragment的实现支持lib.因此,您要么实现自定义解决方法,要么使用已经实现它们的第三方库(请参阅此问题)

编辑:正如@eugen在他的回答中指出的那样,我自己从support-v13引用了FragmentTabHost,它支持原生片段.但是,此信息不会改变整体问题.事实上,如果我将此API与片段嵌套一起使用,我的应用程序今天将无法在~30%的设备上运行(本机片段支持从4.2开始嵌套).

例:

我今天遇到的另一个问题(浪费了太多时间)是通过ActionBarDrawerToggle提供的android.support.v7.app.ActionBarDrawerToggle.我想使用此功能,因此我将整个添加com.android.support:appcompat-v7:21.0.+到项目的依赖项中.我猜这会做,但我错了 - 我的应用程序没有编译(缺少支持库引用的资源).在从网上尝试了一些技巧之后,我发现这个问题最终提供了解决方案.简而言之:v7支持库依赖于SDK,因此我不得不定义compileSdkVersion 21.

后果:

现在,我告诉自己:FragmentTabHost尚未添加到任何SDK版本中,这意味着即使是4到5年后,开发人员仍将继续使用support-v4 lib来提供此功能(因为即使今天添加了此API) ,你可以安全地假设所有目标设备本地支持它,需要几年时间,对吧?相同的参数适用于android.support.v4.widget.DrawerLayout仅存在于支持库中的API和其他API.

如果开发人员多年来一直使用支持库,这也意味着他们在这些问题已经解决之后很久就会遇到上述不一致/依赖问题,对吧?

题:

谷歌为什么要永远保留这些图书馆?如果将所有新API与兼容库并行添加到SDK中,那么对于每个人来说都不会更好,这样兼容性库可能会老化并在某些时候"退出"吗?

编辑:关注@ eugen的回答我现在更加困惑 - 一些API"升级"了更新的支持库,但是没有进入主SDK(比如FragmentTabHost,它从support-v4演变为support-v7).不将它们添加到SDK的原因是什么?

compatibility android android-support-library

20
推荐指数
1
解决办法
1698
查看次数

ViewModel是否能够在活动保存和恢复后生存?

ViewModel如果以下列方式使用,新类的实例可以在配置更改后继续存在:

mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
Run Code Online (Sandbox Code Playgroud)

但是,除了配置更改之外,还有一个保存还原方案,当整个应用程序的进程被终止时.

ViewModel在保存还原方案中,是否会保留字段内的值?


编辑:根据这个问题的答案,我写了这篇文章:Android ViewModel Architecture Component is Dangerous

android viewmodel view-model-pattern android-viewmodel android-architecture-components

14
推荐指数
2
解决办法
5886
查看次数

可以从相同的源代码构建产生功能不同的可执行文件吗?

最近,我的一位同事说了这样的话:"构建服务器从同一源代码生成的连续APK(可执行文件)可能不一样".此讨论的上下文是在构建X上执行的QA是否也适用于构建Y,它由相同的源代码由相同的构建服务器(以相同方式配置)执行.

我认为由于各种因素(例如,不同的时间戳),生成的可执行文件可能不完全相同,但问题是它们是否可以在功能上不同.

我能想到的唯一情况是,相同的源代码可以产生不同的功能,这就是多线程问题:在多线程代码同步不正确的情况下,在编译时执行不同的重新排序/优化操作可能会影响这个不良同步的代码并改变其功能行为.

我的问题是:

  1. 由相同源代码的同一构建服务器执行的连续构建是否可以在功能上不同?
  2. 如果#1为真,这些差异是否仅限于错误同步的多线程代码?
  3. 如果#2为假,那么其他可以改变的部分是什么?

任何相关材料的链接将不胜感激.

java android build

12
推荐指数
2
解决办法
442
查看次数

如何在检测特定短语和滚动位置的点击时在Android中显示HTML文本?

我从服务器上获得了一段纯HTML文本,需要在我的应用程序中呈现它,但并非全部.

我还需要检测文本中特定短语的点击次数.短语由两个数字定义:短语开始的单词计数和单词结束的单词计数(例如,从单词10到单词15).

我的直觉说我可以根据短语规范用链接或一些JavaScript来检测HTML,然后听取这些链接的点击.但是,我不确定如何在Android中实现这种功能.

此外,我还需要能够以编程方式观察和操纵所显示的HTML文本中的滚动位置.例如,我需要了解何时在屏幕上滚动特定短语.

我想我有三个密切相关的问题:

  1. 哪种说法,我应该用它来实现上述功能(TextView,WebView,等)?
  2. 如何收听HTML特定部分的点击?
  3. 如何观察和操纵滚动位置?

谢谢

html android

12
推荐指数
1
解决办法
301
查看次数

设备关闭后,为什么Android应用会回滚到以前的版本?

观察到Android应用程序的这种非常奇怪的行为。大概情况:

  1. 设备上安装的版本A
  2. 申请工作还可以
  3. 设备上安装的版本B(B> A)
  4. 申请工作还可以
  5. 设备因电池电量耗尽而关闭
  6. 设备已开启
  7. 应用程序的版本A再次在设备上运行

附加信息:

  • 该应用程序不是通过Google Play分发的,而是通过USB连接在本地安装的(注意:该应用程序在生产环境中运行;不是通过AndroidStudio安装的)。
  • Android 5.1(API 22)

我想我有两个问题:

  • 为什么设备缓存了较旧版本的APK(以及在何处缓存了它)?
  • 在什么情况下应用程序可以回滚到以前的版本?

编辑(更多信息):

  • 好像在APK回滚后,应用程序失去了一些权限(甚至是所有权限)。由于从Android的API抛出SecurityException,所以回滚停止工作之前起作用的功能。即使此版本的Android还没有运行时权限,也会发生这种情况!
  • 浏览平板电脑的文件系统之后,我确实看到几个应用程序的居住的APK在类似的路径:/data/app/com.myapp-2/base.apk/data/app/com.myapp-3/base.apk,等。

我目前的假设是电池耗尽会导致平板电脑“重置”其状态(例如,时钟也会重置),并且在再次通电时,它会混淆应用的APK之间并加载错误的APK。

但是,我不知道为什么会这样做,或者如何防止这种行为。

android

11
推荐指数
1
解决办法
192
查看次数

如何使GitHub的Immutables在IntelliJ + Gradle中工作

我使用GitHub的Immutables库进行Android开发,现在我想在后端方面尝试一下.

在Android中,为了使用该库,我需要的是:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    // immutable entities generation
    provided "org.immutables:value:2.5.5" // for annotations
    provided "org.immutables:builder:2.5.5" // for annotations
    provided "org.immutables:gson:2.5.5" // for annotations

    ... other dependencies
}
Run Code Online (Sandbox Code Playgroud)

当我尝试将上述依赖项复制到build.gradle我的Java项目中时,我收到此错误:

Error:(24, 0) Gradle DSL method not found: 'provided()'
Run Code Online (Sandbox Code Playgroud)

我试图providedcompileOnly和替换compile,但是然后@Value.Immutable没有生成带注释的接口的实现.

我如何使其工作?

java intellij-idea gradle build.gradle immutables-library

10
推荐指数
2
解决办法
3106
查看次数

Android程序流控制存在startActivityForResult调用

有问题的程序在Android上运行时控制从属蓝牙(BT)设备.它具有几个按钮,可以启用对等设备的不同功能.

默认情况下,Android设备上未启用蓝牙,并且在按钮单击后短时间内建立连接.

因此,每次点击按钮后的流程为:

  1. 确保启用BT(startActivityForResult()如果没有BT启用意图)
  2. 连接到远程设备
  3. 启用远程设备的某些功能
  4. 断开与设备的连接

我的问题是,如果没有启用BT,那么startActivityForResult()在#1中的调用会"打破"程序流程.后来,当onActivityResult()被调用时,我想从"被打破"的点恢复流程.

为此,我定义了额外的成员字段和几个常量,并将它们用于onActivityResult():

private int mRerunMethodIndex = 0;
private static final int RERUN_METHOD1 = 1;
private static final inr RERUN_METHOD2 = 2;
...
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case REQUEST_ENABLE_BT:
            if (resultCode == Activity.RESULT_OK) {
                int rerunMethodIndex = mRerunMethodIndex;
                mRerunMethodIndex = 0;
                switch (rerunMethodIndex ) {
                    case (RERUN_METHOD1):
                        method1();
                        break;
                    case (RERUN_METHOD2):
                        method2();
                        break;
                    // ... the same for …
Run Code Online (Sandbox Code Playgroud)

android event-handling android-activity

8
推荐指数
1
解决办法
362
查看次数

Apache Shiro 1.4.0初始化

我安装了Apache Shiro 1.4.0,并按照这个官方教程进行设置.

当我尝试使用教程中的代码进行初始化SecurityUtilsSecurityManager:

Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Run Code Online (Sandbox Code Playgroud)

我收到的消息IniSecurityManagerFactory现在已被弃用,有利于Shiro的Environment.

我找不到任何教程来演示如何初始化Shiro使用Environment,其文档没有多大帮助:

Environment实例封装了Shiro运行所需的所有对象.它本质上是一个"元"对象,从中可以为应用程序获取所有Shiro组件.

通常在解析Shiro配置文件时创建Environment实例.环境实例可以存储在应用程序认为必要的任何位置,并且可以从中检索实现安全行为可能需要的任何Shiro组件.

例如,通过Environment实例可访问的最明显的组件是应用程序的securityManager.

那么,我该如何使用这种新的初始化机制呢?

java apache security shiro

7
推荐指数
1
解决办法
828
查看次数

如何在 Android 上增加 Kotlin 协程 Dispatchers.IO 的大小?

协程Dispatchers.IO上下文限制为 64 个线程。这不足以在高并发系统中可靠地与阻塞代码交互。

文档指出

该池中的其他线程被创建并按需关闭。此调度程序使用的线程数受“kotlinx.coroutines.io.parallelism”(IO_PARALLELISM_PROPERTY_NAME)系统属性值的限制。它默认为 64 个线程的限制或内核数(以较大者为准)。

我想将kotlinx.coroutines.io.parallelism系统属性更改为其他内容。但是,如果我只是这样做:

adb shell "setprop kotlinx.coroutines.io.parallelism 1000"
Run Code Online (Sandbox Code Playgroud)

然后我得到以下结果:

setprop: failed to set property 'kotlinx.coroutines.io.parallelism' to '1000'
Run Code Online (Sandbox Code Playgroud)

此外,如果我想发布我的应用程序,那么我还需要在用户设备上更改此属性,对吗?否则应用程序将无法运行。但是,即使假设有可能,据我所知,所有更改此属性的应用程序都将覆盖彼此的设置。这听起来不像是一种可靠的操作模式。

所以,在这种情况下,我有三个问题:

  1. 文档中隐含的属性是否确实是我试图更改的“系统属性”?
  2. 如何在非 root 设备上为我的应用程序的所有用户更改此属性?
  3. 有没有更好的选择?

PS 我知道如果我只使用协程而不阻塞代码,这不会是一个问题(可能)。但是让我们假设我需要使用阻塞调用(例如遗留 Java 代码)。

android kotlin kotlin-coroutines

7
推荐指数
2
解决办法
2177
查看次数