小编Tal*_*nel的帖子

Activity.finish()方法到底在做什么?

我正在开发Android应用程序一段时间,并且关注了很多关于活动生命周期和应用程序生命周期的帖子.

我知道Activity.finish()方法调用的方法Activity.onDestroy(),并从堆栈中删除活动,我想它以某种方式指向操作系统和垃圾收集器,他可以"做他的把戏"并释放内存,当它发现它是一个很好的时间做所以....

我来到这篇文章 - 退出申请不赞成?并阅读Mark Murphy的回答.

这让我对这个finish()方法究竟是做什么感到困惑.

我有机会打电话finish(),onDestroy()不会打电话吗?

android application-lifecycle activity-lifecycle ondestroy

148
推荐指数
7
解决办法
20万
查看次数

Android硬件加速 - 使用或不使用?

我正在开发一个应用程序,其功能与Facebook Android原生应用程序非常相似:社交网络,大多数时候用户将花费在无尽的ListView显示批量图像,进入图像库等等.

让我们说讨论我正在做所有正确的事情和最好的Android实践来实现平滑滚动(应该回收视图,在需要时使用不同的视图类型,加载到内存只需要大小的缩放位图,缓存位图,使用ViewHolder设计模式,在可能的情况下不阻塞UI线程等等......)

让我们说我的应用程序中的其他所有内容都以最佳方式编写并遵循最佳实践(讨论......: - >)

我的应用程序工作不坏在那个阶段,但在硬件加速转弯时,如所描述并承诺在Android开发者文档, 它使我的应用程序很多很多更加顺畅,快捷.

让我们说它不会像在任何不支持的操作中那样在UI上以任何负面的方式影响

根据Google关于这个主题的文档,只有我能看到不使用此功能的原因(除了上面提到的所有其他原因)之外,它可能会导致我的应用程序使用更多内存.但是RAM多少钱?多很多?我知道当我的应用程序消耗大量的RAM时 - 当它需要释放一些内存时,它会被操作系统摧毁.

我的问题基本上是 -

  • 在我的情况下使用此功能是"好"吗?
  • 使用它可以带来哪些其他问题?

TIA

android hardware-acceleration android-hardware android-gui

41
推荐指数
2
解决办法
5万
查看次数

Fused Location Provider意外行为

这是我注册我的应用程序以接收位置更新的方式:

mLocationRequest = LocationRequest.create();
mLocationRequest.setInterval(Consts.ONE_MINUTE * 10);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
mLocationRequest.setFastestInterval(Consts.ONE_MINUTE);

Builder builder = new GoogleApiClient.Builder(context);
builder.addApi(ActivityRecognition.API);

mGoogleApiClient = builder.addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();

mGoogleApiClient.connect();

....
....

@Override
public void onConnected(Bundle connectionHint) {
   LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, locationUpdatespendingInent);
}
Run Code Online (Sandbox Code Playgroud)

我的待处理意图几乎在确切的请求间隔内在后台调用了......

到现在为止还挺好.

问题: 当WIFI被禁用/未连接到任何网络,或者没有启用3G/4G网络数据时 - 融合位置提供商不提供新的位置更新!!

我的位置访问设置已打开,并且会检查GPS卫星和WI-FI以及移动网络位置.

在更严重的问题:有时候在这种情况下,我通过悬而未决的意图接收位置更新回调,但最后的位置就知道(即使是一个小时前,和我在很久很久不见了远离那个地方英里)

根据以下文件PRIORITY_BALANCED_POWER_ACCURACY:

与setPriority(int)一起使用以请求"块"级别的准确性.块级精度被认为是大约100米的精度.使用诸如此类的粗略精度通常会消耗更少的功率.

我期待融合位置提供商在没有其他选择的情况下打开GPS,或者如果他没有任何选择,至少不会提供新的位置更新.

另一个不可预测和令人不安的问题:

我改变了PRIORITY_BALANCED_POWER_ACCURACYPRIORITY_HIGH_ACCURACY中才能看到它的行为(24小时).所有间隔保持不变(更新之间间隔10分钟).即使在没有网络/ SIM卡的手机中也确实收到了准确的位置,但是 - 电池耗尽快!当我查看电池历史时,我惊讶地发现GPS无线电一直处于全传输模式! 我还在我的日志中看到每分钟收到一个位置,即使我每十分钟请求一次位置(我没有任何其他安装的应用程序打开GPS接收位置..)

我注意到在多个设备上(如摩托X 2013,HTC One X的,Nexus 5的)这种行为,所有最新的谷歌播放服务(版本6.1.11),以及Android 4.4.4奇巧

我的应用程序很大程度上取决于用户当前位置,并且只要用户登录,就会在指定的时间间隔内定期接收位置更新,因此我不想使用该PRIORITY_HIGH_ACCURACY模式,以防止电池耗尽.

我的问题:

  • 是融合位置提供商,如果它设置为接收更新PRIORITY_BALANCED_POWER_ACCURACY并且没有任何WI-FI或手机信息塔信息,则假设完全使用GPS ?

  • 如果确实如此,那么我做错了什么?

  • 为什么我得到这个误导性的位置更新不正确?(正如我在"更大问题"一节中所解释的那样..

  • 为什么GPS无线电一直打开而不是在我使用PRIORITY_HIGH_ACCURACY参数时打开10分钟?(我没有其他安装的应用程序可以更快地触发位置更新..)

gps android android-location google-play-services location-services

26
推荐指数
1
解决办法
2万
查看次数

为什么调用Process.killProcess(Process.myPid())是个坏主意?

我读过一些帖子说使用这种方法"不好",不应该使用,这不是"关闭"应用程序的正确方法,而不是android的工作方式......

我理解并接受这样一个事实,即在正确的时间终止这个过程时Android OS比我更清楚,但我没有听到一个很好的解释为什么使用这个killProcess()方法是错误的?毕竟 - 它是android API的一部分......

我所知道的是,调用此方法时,其他线程正在执行潜在的重要工作(对文件的操作,写入数据库,HTTP请求,运行服务......)可以在中间终止,而且显然不是很好.此外,我知道我可以从"重新打开"应用程序将更快的事实中受益,因为系统可能仍然从上次使用时"保持"在内存状态,并killProcess()防止这种情况.

除了这个原因,假设我没有这样的操作,而且我不在乎我的应用程序会从头开始每次运行,还有其他原因为什么不使用这个killProcess()方法?

我知道关闭一个Activity的finish()方法,所以请不要写我这个... finish()仅供参考Activity.不是所有应用程序,我想我确切知道为什么以及何时使用它...

还有一件事 - 我正在使用Unity3D框架开发游戏,并将项目导出到android.当我反编译生成的apk时,我非常惊讶地发现java源代码是从Unity创建的 - 实现Unity的finish()方法,用Activity.

Application.quit()假设是根据Unity3d指南关闭游戏的正确方法(它真的吗?也许我错了,并且错过了一些东西),那么Unity的框架开发人员如何做得非常好,因为它似乎实现了这个原生android到Process.killProcess(Process.myPid())

android kill-process unity-game-engine

25
推荐指数
3
解决办法
1万
查看次数

Android Crashlytics - 限制网络访问

我一直在努力解决在某些条件下限制Crashlytics网络使用的问题.例如 - 漫游,计量网络等等.

根据SDK文档,我发现只有两个选项可以解决这个问题:

  • 只需不初始化Crashlytics即可在运行时"退出"

  • 发送崩溃报告之前内置用户同意对话框

这个API非常有限,因为:

  • 不初始化Crashlytics不仅会阻止网络访问,还会阻止任何机会Crashlytics在本地保存崩溃报告,以便最终发送事件.更不用说除了粗暴地重写Thread.setUncaughtExceptionHandler之外没有好的方法可以在运行时选择退出

  • 如果在后台发生崩溃,则同意对话框对用户没有任何意义.

我的问题基本上是:我错过了什么?有没有办法限制Crashlytics网络访问?

我的动机来自需要防止我的应用程序使用网络带宽可能会在某些条件下花费给用户的钱,尽管"蜂窝网络"或"使用漫游时使用数据"设备设置已启用.

android crash-reports crashlytics

19
推荐指数
4
解决办法
605
查看次数

SensorEvent.timestamp不一致

我的应用程序使用android 4.4.X中引入的步进检测器传感器API在后台步骤计数中执行.

我的应用程序必须知道每个步骤事件产生的确切时间(至少准确度为一秒).

因为我执行传感器批处理,所以onSensorChanged(SensorEvent event)调用的时间与步骤事件发生的时间不同 - 我必须使用该event.timestamp字段来获取事件时间.

有关此字段的文档是:

事件发生的纳秒时间

问题:

在某些设备(例如Moto X 2013)中,这个时间戳似乎是自启动以来的纳秒时间,而在某些设备(例如Nexus 5)中,它实际上以纳秒为单位返回通用系统时间System.currentTimeMills() / 1000.

据我所知,关于这一点已经存在一个陈旧的问题,但是由于引入了传感器批处理 - 使用该字段来了解事件时间变得非常重要,并且不可能再依赖于System.currentTimeMills()

我的问题:

我该怎么做才能在所有设备上始终以系统毫秒为单位获取事件时间?

android nanotime android-sensors

15
推荐指数
1
解决办法
3503
查看次数

DownloadManager - 了解ERROR_HTTP_DATA_ERROR

我的应用程序在很大程度上依赖于android DownloadManager组件来下载大小为3-10兆字节的文件.

在扩大规模(达到数百万次下载)时,整体情况很明显:

由于ERROR_HTTP_DATA_ERROR ,所有下载中约有50%失败.

我从谷歌分析中获取此信息

根据文档,此错误代码代表:

在HTTP级别发生错误接收或处理数据时COLUMN_REASON的值.

我发现这个文档不是很有用.
那里有很多http错误.

以及下载过程中的网络断开情况怎么样?它是否也在ERROR_HTTP_DATA_ERROR失败所有下载的管理器重试尝试后触发错误?

如果有人能帮我理解,那就太好了:

  • 有没有办法从DownloadManager更多关于确切的http错误的信息?
  • ERROR_HTTP_DATA_ERROR下载管理器可以解决哪些最常见的情况?

另一点值得一提:虽然这个错误累积 - 用户连接到WIFI网络(我设置下载管理器只能通过wifi下载)

请不要建议我根本不使用下载管理器.我知道这个选项,优点和缺点.我将此选项保存为最后的手段.

android http-error android-download-manager

15
推荐指数
2
解决办法
3180
查看次数

android 3.x中的拖放会导致拖动后的少量数字导致illegalStateException

在Android 3.x上有拖放机制的问题:在做了一些拖动(比如30次拖动)之后会产生异常(参见附件链接)

https://groups.google.com/forum/#!msg/android-platform/2APvO248NNY/rKI-5dCT8XcJ (我在日志中收到与该帖子相同的内容..)

android技术人员在那里回答它是API中的错误,并说避免问题的唯一方法是调用垃圾收集器.

我做的.异常没有被抛出,但过了一段时间(比如更多30-40次拖动)android停止从某种原因调用drop事件.

我尝试通过释放所有资源/画布/绘图缓存/回收位图来"刷新"所有视图并重新创建它们并没有帮助(不再抛出异常 - 但仍有一些拖拽掉落事件后'工作)

"帮助"唯一的事情是关闭活动并重新启动它.

有人以某种方式解决了这个问题,或者有一个简单的替代方案??? (旁边实现我自己的拖放功能..)

我想得到解决方案,不会强迫我重新启动或重新创建任何不想要的东西..

这里是演示错误的示例代码(没有演示我在使用System.GC后对drop事件的问题所说的部分):

public class DragandDropExampleActivity extends Activity {

private boolean mIsBeenDragged = false;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final ImageView imageViewToDRag = (ImageView) findViewById(R.id.image_view_to_drag);

    imageViewToDRag.setClickable(true);

    imageViewToDRag.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                mIsBeenDragged = true;
                DragShadowBuilder shadowBuilder = new DragShadowBuilder(imageViewToDRag);
                imageViewToDRag.startDrag(null, shadowBuilder, imageViewToDRag, 0);
            } else if (event.getAction() == MotionEvent.ACTION_UP) {

                mIsBeenDragged = false; …
Run Code Online (Sandbox Code Playgroud)

android drag-and-drop view touch-event illegalstateexception

14
推荐指数
1
解决办法
1057
查看次数

RecyclerView:在创建视图后立即查找最后一个可见项目

我遇到以下方法的问题:

int firstVisibleItemPosition = gridLayoutManager.findFirstVisibleItemPosition();
int lastVisibleItemPosition = gridLayoutManager.findLastVisibleItemPosition();
Run Code Online (Sandbox Code Playgroud)

我的目标:保存有关用户查看过的项目的分析数据.

为了做到这一点,我在两种不同的场景中调用这些方法:

  • 每次滚动都转到"空闲"状态,并检查可见项目是什么.在那种情况下,我得到了预期的索引.

  • RecyclerView变得对用户"可见"时.现在就是问题开始的时候.我希望当传递包含recylcerView的片段时,onResume() 调用findLastVisibleItemPosition()将返回可见项. 但在这种情况下它返回-1. 我想这与RecyclerView +适配器内部项初始化相对于片段/活动生命周期的异步加载有关.

通过将此代码推迟几毫秒 - findLastVisibleItemPosition()返回正确的索引.但我不想推迟硬编码使用处理程序+延迟runnable,因为调度延迟runnable是我真正想做的解决办法:检测回收器视图何时完成膨胀并将所有视图绘制到屏幕上脚里面..

所以我的问题基本上是:

  • 如何检测RecyclerView何时完成所有初始化/测量/充气并将其绘制到屏幕上的子项?(在任何用户交互之前......).

  • 有没有可靠的良好实践方法来确切知道回收者视图中的哪些项目真正显示在屏幕上?

android android-layout android-adapter android-recyclerview

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

android apk的静默安装

我正在寻找一种方法来编程我的应用程序以静默安装apk文件.我知道启动代码的可能性看起来像这样:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
startActivity(intent);   
Run Code Online (Sandbox Code Playgroud)

但是这个代码在安装之前启动了一个带有apk需要权限的对话框,需要用户授权才能开始安装.

有没有办法跳过这个对话框?有没有其他方法可以在我的代码中运行时安装不需要用户交互的应用程序?

android apk silent-installer

10
推荐指数
1
解决办法
7144
查看次数