我正在寻找一种方法来编程我的应用程序以静默安装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 Developers网站,Bitmap.recycle()方法定义是:
释放与此位图关联的本机对象,并清除对像素数据的引用
我开发了一些创建/解码大量位图的应用程序,并将结果位图对象放到ImageViews中.有时我会遇到一些着名的例外情况,例如:
位图大小超出了vm预算
和
内存不足错误
此外,我确信我没有任何可能导致此问题的内存泄漏.
经过大量搜索后,我发现了"循环"方法,并在不再需要时使用它来释放位图的本机内存. 好像它帮了很多忙.
我问这是不是我应该在这种情况下做的事情,因为我知道系统正在这样做而不明确地调用它(是吗?也许我错了).
我应该在这样的情况下使用这种方法吗?
在什么情况下我应该使用这种方法?
我应该使用这种方法吗?
提前致谢.
更新:
谷歌最近发布了这个指南,其中说:
在Android 2.3.3(API级别10)及更低版本上,建议使用recycle().如果您在应用中显示大量位图数据,则可能会遇到OutOfMemoryError错误.recycle()方法允许应用程序尽快回收内存.
android garbage-collection bitmap out-of-memory android-imageview
我正在开发一个将在固件上预安装(作为系统应用程序)的应用程序.
从文档到目前为止关于系统应用程序,新权限模型和保护级别之间的关系- 我不清楚系统应用程序何时需要(如果有的话)请求用户权限.
当我尝试使用WRITE_EXTERNAL_STORAGE权限时,我的问题就出现了.从文档中我可以看到它被标记为"危险"的许可.
- "危险"权限是否自动授予系统应用程序?
当我使用WRITE_EXTERNAL_STORAGE权限(作为系统应用程序)我得到安全异常,我不知道是否意味着即使我的应用程序安装为系统应用程序也很困难 - 用户必须请求"危险"权限.
还有一点需要提一下:
要将应用程序行为检查为系统应用程序,我将我的应用程序APK安装在sys-priv运行SDK预览3的nexus 5 的目录(设备已植根)上.这是我获得安全性异常的时候在使用方法时需要外部存储权限..
android android-firmware android-permissions android-6.0-marshmallow
假设我想要实现一个将服务公开给其他应用程序(如Google Play服务......)的应用程序.
潜在的应用程序将注册到我的服务相关的特殊事件,并将在适当的时间通知.
我正在考虑像Google使用Google Play服务那样实现这一点:
感谢Android进程间通信,其他应用程序可以绑定到我的应用程序Service,并通过它 - 传递给我的应用程序PendingIntent"回调",我可以在适当的时间执行它们.
现在,我会遇到这个问题:
我的应用程序进程当前正在运行(在后台)并持有PendingIntent其他应用程序提供的引用.
现在,由于某种原因(系统决策/用户明确)我的流程已停止.
我的过程在某些时候回来了,然后回到"做它的事情......"
在那一点上 - 我之前没有参考PendingIntent提供给我的内容,我在API中没有看到任何方法来检索对它的引用.
我也没有看到任何保存持久性的方法(数据库/ sharedPreferences /文件系统)保存后者的待定意图
我的问题是:
是否有可能以某种方式持久存储待处理的意图?
是否有可能"回来"引用我之前已经获得的相同的未决意图?
如果没有,是否还有其他建议来实施我所描述的这样的事情?
我的目标是找到附近的蓝牙设备(LE设备和"经典"),以便将当前可见的附近设备与我的应用程序使用它的某些功能相关联. (不是特定的设备/设备,而是所有设备/设备!!!)
我知道的:
startLeScan() 只能用BLE设备回调BluetoothDevice通过广播返回找到的. 我不确定的是:
startScan()将始终发现可发现的BLE和经典设备. BluetoothDevice.connectGatt() 添加了新的BLE API,但也应该使用经典蓝牙(返回GATT服务......).我想知道的是:
startScan()返回两种类型(Classic和BLE),那么在电池消耗,性能,良好实践和其他方面使用哪种更好?我的应用程序将定期执行后台扫描,因此我希望尽可能减少对电池消耗的影响.
我想问一下,是否有可能检查服务是否正在从广播接收器运行.
我知道在Activity中这是可能的.
谢谢你的宝贵帮助
根据文档,如果由于http错误导致下载失败 - COLUMN_REASON应该保留特定的http错误代码.
我遇到的问题是,在实践中,我看到下载失败的唯一原因是 ERROR_HTTP_DATA_ERROR
另外,我在logcat中看到运行时实际失败的http代码,当下载停止并重新尝试时,但我没有看到任何方法从下载管理器获取它.
有可能以某种方式得到这个http代码?
我正在使用广播接收器来处理ACTION_DOWNLOAD_COMPLETE,但我没有看到任何方式听下载暂停,我感觉如果我将在重试尝试之间查询下载管理器失败原因 - 那么我'我会得到实际的状态代码.
是否可以在不查询下载管理器的情况下收听"下载暂停"事件?
我希望这将是这样的广播.
我最终想要得到答案的问题是:
这是许多应用程序面临的常见情况,但我正在分散理解如何实现:
假设我的应用程序是一个具有当前登录用户的社交网络.我想向当前用户登录的所有设备发送GCM消息给该用户.
这意味着我的服务器为每个用户保存了他所有注册ID的列表 - 每个用户的一个注册ID.
问题:如何唯一地跟踪他的每个设备? 似乎没有可靠的方法来获取特定的设备标识符
没有为每个独特的设备存储注册ID - 我不知道如何管理它.
当用户将卸载/注销并随后获得新的注册ID时,事情变得混乱,假设要替换现有的已知id之一,但是哪一个?
如果我喜欢只向特定设备发送消息,而不是所有设备,那么事情会变得更加棘手......
请帮助我理解我遗漏的内容,以及为同一用户处理多个设备注册ID的正确方法.
我在清单中为ACTION_DOWNLOAD_COMPLETE广播注册了一个 BroadcastReceiver 。
当我收到此广播时,我提取下载 ID:
public class DownloadCompleteBroadcastReceiver
extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
String action = intent.getAction();
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
handleDownloadCompleteReceiver(context, intent);
}
}
}
private void handleDownloadCompleteReceiver(Context context, Intent intent) {
long enqueueId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (enqueueId != -1) {
Intent startServiceIntent = new Intent(context, HandleAPKDownloadCompleteIntentService.class);
startServiceIntent.putExtra(HandleAPKDownloadCompleteIntentService.EXTRA_ENQUEUE_ID, enqueueId);
context.startService(startServiceIntent);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了一个有效的值enqueueId并开始IntentService处理下载的文件:
@Override
protected void onHandleIntent(Intent intent) {
long enqueueId …Run Code Online (Sandbox Code Playgroud) 我想测试我的应用在 Android Go 上的表现。
根据这篇文章:https : //developer.android.com/develop/quality-guidelines/building-for-billions-device-capacity.html#androidgo
我了解需要设置以下条件:
<uses-feature android:name="android.hardware.ram.low" android:required="true">到应用程序清单。如何判断我的应用是否在 Android Go 模式下运行?
我创建了一个具有以下配置的模拟器:
名称:Andorid_go_API_27
CPU/ABI:Google APIs Intel Atom (x86)
路径:C:\Users\rotem.matityahu.android\avd\Andorid_go_API_27.avd
目标:google_apis [Google APIs](API 级别 27)
皮肤:1080x1920
SD 卡:100 MiB
hw.dPad:没有
hw.lcd.height: 1920
runtime.network.speed:满
hw.加速度计:是的
hw.device.name:新设备 1
vm.heapSize:256
skin.dynamic:是的
hw.device.manufacturer:用户
hw.lcd.width: 1080
hw.gps:是的
hw.initialOrientation:纵向
skin.path.backup: _no_skin
image.androidVersion.api: 27
hw.audioInput: 是
image.sysdir.1: system-images\android-27\google_apis\x86\
tag.id: google_apis
showDeviceFrame: 没有
hw.camera.back:模拟
hw.mainKeys: 没有
AvdId:Andorid_go_API_27
hw.camera.front:模拟
hw.lcd.密度:480
avd.ini.displayname: Andorid go API 27 …
我们大多数人都熟悉这种模式:
public class MySingeltone {
public String mSomeReferenceTypeData;
public int mSomeValueTypeData;
private static MySingeltone mInstance;
private MySingeltone() {
}
public static MySingeltone getInstance() {
if (mInstance == null) {
mInstance = new MySingeltone();
}
return mInstance;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我最近发现mInstance在使用他的活动被销毁之后,或者当整个应用程序假设为子句时,不等于null,例如:
public class SomeActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MySingeltone mySingeltone = MySingeltone.getInstance();
mySingeltone.mSomeReferenceTypeData = "some value";
}
}
Run Code Online (Sandbox Code Playgroud)
在关闭整个应用程序运行活动(比如说...之后10秒)下次启动"SomeActivity"时,mInstance仍保持相同的引用,并且在其字段上具有相同的值.
它为什么会发生?
我错过了什么?
当android垃圾收集静态成员属于应用程序?
检测应用程序是否在前台有很多原因.例如 - 作为GCM/C2DM推送通知的触发器 - 当应用程序是前台和后台时,许多应用程序将有充分的理由实现不同的行为.其他原因可能是 - 淘汰消耗宝贵资源的服务,例如在后台任务中查询服务器.
需要明确的是:后台app的定义(我认为)是:
应用程序,它没有调用任何活动onStart()方法,也没有调用onStop()方法.那是因为活动只在那个时候在生命周期中对用户可见.
从另一方面 -
似乎Google不希望应用程序对主页按钮作出反应(它不是API的一部分)
onBackPressed()对"root/main"活动作出反应作为指示离开Activity肯定不是一个好主意(因为很多用户使用主页按钮,而不是后退按钮)
API中没有方法可以确定app是否为前景(根据我的定义..)
如果我没有错过API中的某些内容,而且确实如此 - 为什么没有原因可以轻松确定应用程序是否为前景???? !!!!
我知道我可以做的是确定应用程序是否为前景在此主题中描述 - 如何检测Android应用程序何时进入后台并返回到前台
但正如@Emil所说 - 它需要特殊许可,或者需要一些棘手的逻辑,这些逻辑很快就会成为维护的问题,并且它闻起来像是糟糕的方法(虽然这就是我现在正在做的事情,因为我没有更好的想法. ..)
我的问题基本上是:
有充分理由没有这样的API方法吗?
是否考虑应用程序是否为前景是一种不好的方法?
有没有其他方法可以知道应用程序是否是前景?
我希望有人能告诉我一种方法,当设备连接到设备上的USB存储模式/内部文件浏览应用程序时,SD卡上的文件夹被隐藏/不可见/加密.
我还需要能够从我的Android应用程序访问这些文件(只有在它有任何不同的情况下才能读取它们.)
我知道一些文件加密应用程序,如SecretVault pro,但像这样的应用程序没有开发人员的API,允许逐步控制加密/破坏状态.
android ×13
android-go ×1
apk ×1
bitmap ×1
encryption ×1
filesystems ×1
https ×1
performance ×1
service ×1
singleton ×1
ssl ×1