我有一个应用程序,可以获得位置修复.该应用程序将从Gingerbread推出到手机上.一旦应用程序获得位置修复,就会向用户显示Toast消息.问题是当用户移动到下一个活动时,吐司消息可能会再出现十次.
我想我已经正确地实现了生命周期,例如
1)在onCreate()中获取位置管理器2)在onResume()中创建并将位置监听器传递给管理器3)删除onStop()中的更新
我知道我可以通过调用在Android> 4.x中绕过这个问题
mlocManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mlocListener, null);
Run Code Online (Sandbox Code Playgroud)
但是我必须容纳Gingerbread所以调用单个请求不在api 2.3.x. 它在Android 4上工作正常但在姜饼上onLocationChanged方法继续执行10次.
我如何强制onLocationChanged方法只在姜饼上运行一次?
谢谢.
[编辑]我注意到,当我移动到下一个活动时,onlocationchanged方法继续执行,但如果我移动到另一个活动,则成功删除位置请求
@Override
protected void onStop() {
mlocManager.removeUpdates(mlocListener);
mlocListener = null;
super.onStop();
}
@Override
protected void onResume() {
mlocListener = new MyLocationListener();
if(isCompOptionsReceived == true){
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) {
mlocManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mlocListener, null);
}else{
mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
}
}
super.onResume();
}
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location loc) {
//toast message
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void …Run Code Online (Sandbox Code Playgroud) 我在Genymotion上创建了一个新的虚拟设备但我无法运行它.当我点击Genymotion GUI上的"开始"按钮时,没有任何反应.

我能够从Virtual Box运行虚拟设备.虚拟设备显然配置良好,互联网正常运行.

我目前的环境:
值得一提的是,我最近格式化了计算机并从头开始安装了所有东西(甚至Yosemite),所以我可以错过依赖或其他东西.
任何有关如何修复它或获取日志以了解真正问题的帮助或提示将不胜感激.
谢谢
这是不是之间的区别的常见问题api和implementation,并希望将但从构建一个多模块项目的点更先进的和有趣的.
假设我在应用程序中有以下模块
librarybasefeature1feature2app现在模块之间的关系是:
base 包装 library
feature1并feature2使用(取决于)base
app拼feature1和feature2
这个多模块结构中的所有内容都应该能够使用Gradle的implementation依赖项工作,并且不需要在api任何地方使用该子句.
现在,让我们说feature1需要访问base包含在其中的实现细节library.
为了使library提供给feature1我们有两个选择,据我可以告诉:
更改implementation为api在base泄漏依赖于依赖模块base
library作为implementation依赖项添加,feature1而不会base泄漏依赖性library
当然,为了解决这个问题,这个例子已经被简化了,但是你明白了这可能会成为一个具有4或5级依赖关系的大量模块的配置地狱.
我们可以创建一个base-feature中间模块,它可以包装base并提供另一级抽象,以便feature1在不泄漏的情况下使用library,但让我们将该解决方案置于此问题的范围之外,以专注于依赖项的设置.
我在上述选项中检测到的一些权衡:
选项1)专业人士
build.gradle的文件,因为不需要重复implementation条款api …我有一个将minSdkVersion设置为9 的Android应用程序.应用程序编译并运行,但是当它显示谷歌地图时,它崩溃了
android.content.res.Resources$NotFoundException: File res/drawable-mdpi-v4/maps_watermark_dark.png from drawable resource ID #0x7f02027c
Run Code Online (Sandbox Code Playgroud)
一切都指向播放服务库中缺少的资源.
我没有使用proguard,shrinkResources或resConfigs.
该设备是三星/ GT-S5360L/GT-S5360L:2.3.6/GINGERBREAD
这是相关部分 build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
targetSdkVersion 21
minSdkVersion 9
versionCode 476
versionName "4.7.6"
}
}
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.google.android.gms:play-services:6.1.71'
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的堆栈跟踪:
D/AndroidRuntime(10297): Shutting down VM
W/dalvikvm(10297): threadid=1: thread exiting with uncaught exception (group=0x40020578)
E/AndroidRuntime(10297): FATAL EXCEPTION: main
E/AndroidRuntime(10297): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.safertaxi.driver/driver.activities.driving.ActivityDriving}: android.view.InflateException: Binary XML file line …Run Code Online (Sandbox Code Playgroud) 我正在使用的项目使用视图展示器抽象.这是所有主要类的简化版本.
抽象活动(Wire Presenter实例,带View)
public abstract class MvpActivity<Presenter extends MvpPresenter>
extends ActionBarActivity {
protected Presenter mPresenter;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter = getPresenterInstance();
}
@Override protected void onResume() {
super.onResume();
mPresenter.onResume(this);
}
@Override protected void onPause() {
mPresenter.onPause();
super.onPause();
}
}
Run Code Online (Sandbox Code Playgroud)
视图界面
public interface MyView {
void redirect();
}
Run Code Online (Sandbox Code Playgroud)
视图实现
public class MyActivity
extends MvpActivity<MyPresenter>
implements MyView {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_view);
Button myButton = (Button)findViewById(R.id.my_button);
myButton.setOnClickListener(v -> mPresenter.onButtonPressed());
}
@Override protected MyPresenter getPresenterInstance() …Run Code Online (Sandbox Code Playgroud) 我正在通过 Gradle 构建文件迁移到 Kotlin DSL,但遇到了一个问题。
在我的父母身上build.gradle,我有以下一段代码
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${Version.kotlin}"
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
subprojects {
afterEvaluate { project ->
if (project.plugins.findPlugin('com.android.application') ?:
project.plugins.findPlugin('com.android.library')) {
android {
compileSdkVersion = Android.SDK_COMPILE
defaultConfig {
minSdkVersion Android.SDK_MIN
targetSdkVersion Android.SDK_TARGET
versionCode = Android.VERSION_CODE
versionName = Android.VERSION_NAME
}
...
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这允许我只在一个地方配置所有作为 android 应用程序或库的模块。
但是,当我迁移到 kotlin 时,这似乎不起作用:
buildscript {
repositories {
google()
mavenCentral()
}
dependencies { …Run Code Online (Sandbox Code Playgroud) 我在 Github Actions 上收到以下 Lint 错误(该项目的当前 CI 解决方案)
> Task :application:lint FAILED
Ran lint on variant debug: 1 issues found
Ran lint on variant release: 1 issues found
Wrote HTML report to file:///~/application/build/reports/lint/lint-results.html
64 actionable tasks: 55 executed, 9 from cache
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':application:lint'.
> Lint found errors in the project; aborting build.
android {
lintOptions {
abortOnError false
}
}
...
Errors found:
~/application/build.gradle.kts:17: Error: Not targeting …Run Code Online (Sandbox Code Playgroud) 在Android中使用Rest Framework处理json有什么好的做法.例如,如果我得到一个特定的json结果如下(或任何其他,我只是给一些更复杂的东西):
{"lifts":
[{
"id":26,
"time":"2012-11-21T12:00:00Z",
"capacity":4,
"price":10,
"from": {
"description":null,
"city": {
"name":"Montreal"
}
},
"to":{
"description":"24 rue de la ville",
"city":{
"name":"Sherbrooke"
}
},
"driver":{
"first_name": "Benjamin",
"image":"https://graph.facebook.com/693607843/picture?type=large"
}
}
]}
Run Code Online (Sandbox Code Playgroud)
1)我应该手动处理结果并获取每个值来填充我的ui ...(不是真的)
2)我应该为每个对象创建一个POJO(使用JSONObject处理映射).在我的例子中,我将不得不创建一个处理所有参数的提升对象,甚至创建更多的POJO,以用于例如图像和可能的位置.(所以基本上,我经常需要检查我的api休息框架,看看我的对象是如何在服务器端完成的,我正在将我的模型从服务器复制到android客户端).
3)是否有任何框架来处理映射(序列化和反序列化).
我目前正在使用2号选项,但想知道那里是否有更好的东西.到目前为止,它对我有用,用于接收和发送.
我想使用Netty框架创建SSL / TLS连接,该框架将在握手期间一起发送SNI标头。我当前的代码如下所示:
SslContext创建:
TrustManagerFactory trustManagerFactory = SimpleTrustManagerFactory.getInstance(
SimpleTrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore)null);
sslContext = SslContextBuilder
.forClient()
.sslProvider(SslProvider.JDK)
// TODO p0: Ensure all the versions we support have this algorithm installed
.trustManager(trustManagerFactory)
.build();
Run Code Online (Sandbox Code Playgroud)
然后在管道创建期间:
pipeline.addLast(sslContext.newHandler(ch.alloc(), cloud.getHostName(), cloud.getPort()));
Run Code Online (Sandbox Code Playgroud)
但是,不会发送SNI标头。强制Netty在SSL客户端握手中提供SNI缺少什么?
每个设备都发送BOOT_COMPLETED吗?我想在Boot Completed上启动一个Activity.
我在Manifest中添加了以下内容:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".BootFinished">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
创建了以下类(接收者):
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.widget.Toast;
public class BootFinished extends BroadcastReceiver {
@Override
public void onReceive(Context mContext, Intent intent) {
if(intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
//do something like start an activity or service
}
try {
PackageManager pm = mContext.getPackageManager();
Intent launch = pm.getLaunchIntentForPackage("com.example.afterboot");
mContext.startActivity(launch);
} catch (Exception e) {
Toast.makeText(mContext, e.getMessage(), Toast.LENGTH_SHORT);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?谢谢!
android ×8
gradle ×2
android-lint ×1
boot ×1
genymotion ×1
google-maps ×1
gps ×1
json ×1
location ×1
multi-module ×1
netty ×1
pojo ×1
sni ×1
sockets ×1
ssl ×1
virtualbox ×1