小编goR*_*Gon的帖子

防止Android中的片段恢复

我们正在使用Fragments,我们不需要在重新创建Activity时自动恢复它们.但每当调用Activity::onCreate(Bundle savedInstanceState)- > 时super.onCreate(savedInstanceState),即使我们对这些片段使用setRetainInstance(false),也会恢复片段.

而且,在那些Fragments Fragment.performCreateView()被直接调用而不经过Fragment::onAttach()等等.另外,一些字段在恢复内部为空Fragment...

有谁知道如何阻止Android恢复片段?

PS我们知道,如果为配置更改重新创建活动,可以通过添加到清单a来完成ndroid:configChanges="orientation|screenSize|screenLayout.但是在自动内存清理的情况下重新创建活动呢?

android garbage-collection memory-management fragment recreate

30
推荐指数
2
解决办法
8399
查看次数

TrivialDrive vs TrivialDrive V2?

为什么TrivialDrive有两个版本?

https://github.com/googlesamples/android-play-billing

哪个版本应该是学习应用内结算的主要参考项目?版本之间有什么区别?

android github in-app-purchase play-billing-library

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

如何禁用Google Assist API(现在点击)

Google最近发布了具有Now on Tap的Android Marshmallow,可以扫描应用内容并向用户提供其他信息.

不幸的是,我们的应用程序的信息看起来并不十分相关和谷歌无视我们的内部设置数据onProvideContentAssist()onProvideAssistData().

这些规格看起来相当高,并且还包含" 可以建议 "和" 附加信息 "等词语,因此Google似乎正式允许自己忽略开发人员提供的数据.

所以我们决定禁用Now on Tap,但似乎并不是非常简单.根据上面提供的文件,我们应该FLAG_SECURE在这种情况下使用.但随后用户无法捕获屏幕截图,Google Now on Tap开始以下面面向用户的消息来指责我们的应用:

结果不可用
此应用已阻止Now on Tap

在此输入图像描述

但似乎Opera在某种程度上轻轻地阻止了Now on Tap的私人标签.它为他们显示了更多app友好的消息:

什么都没有

在此输入图像描述

Opera如何阻止现在点击?

有没有人知道如何阻止Google Assist API(现在点击)而不会对我们的应用程序负责?

android google-now android-6.0-marshmallow google-assist-api

9
推荐指数
2
解决办法
2536
查看次数

为什么Google Play结算库未显示在SDK Manager中?

我想在应用内购买Android应用程序,我经常阅读我必须从SDK Manager下载Google Play结算库

(例如http://www.techotopia.com/index.php/An_Android_Studio_Google_Play_In-app_Billing_Tutorial#Installing_the_Google_Play_Billing_Library),但我找不到它.我需要这个文件吗?如果是,我如何管理它显示给我?在developers.android webside上没有写入Google Play结算库,但如果我将他们的示例代码复制到我的项目中,我会收到很多错误.我在github上搜索了示例项目,我找到了一个,但是当我运行它时,应用程序崩溃了.有没有示例项目,我认为这可以解决我的问题?

我的SDK Manager

谢谢 !!!

sdk android in-app-purchase in-app-billing play-billing-library

5
推荐指数
1
解决办法
6588
查看次数

没有if,切换实现Factory的最佳方法

我正在寻找许多方法来实现Java中的Factory模式,但仍然找不到一个完美的方法,如果/ switch plus不使用反射,则不会受到影响.我找到的最好的一个是Tom Hawtin在这里的答案:https://stackoverflow.com/a/3434505/1390874

但我最担心的是它将匿名类的HashMap存储在内存中.

问题是除了Tom Hawtin的答案之外,人们还会考虑使用Class.newInstance()吗?这样可以避免我们在内存中存储不必要的匿名类吗?加上代码会更干净.

它看起来像这样:

class MyFactory {
    private static final Map<String,Class> factoryMap =
        Collections.unmodifiableMap(new HashMap<String,Class>() {{
            put("Meow", Cat.class);
            put("Woof", Dog.class);
    }});

    public Animal createAnimal(String action) {
        return (Animal) factoryMap.get(action).newInstance();
    }
}
Run Code Online (Sandbox Code Playgroud)

java design-patterns factory factory-pattern

3
推荐指数
2
解决办法
4809
查看次数

Google Play Billing 1.0无接口方法getBuyIntentExtraParams

我想将新的Google Play结算库添加到我的项目com.android.billingclient:billing:1.0- > lien

但是当我跑步时:

final BillingFlowParams.Builder builder = BillingFlowParams.newBuilder()
            .setSku(sku)
            .setType(BillingClient.SkuType.INAPP);
int resultCode = mBillingClient.launchBillingFlow(activity, builder.build());
Run Code Online (Sandbox Code Playgroud)

我有这个问题:

Caused by: java.lang.NoSuchMethodError: No interface method getBuyIntentExtraParams(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle; in class Lcom/android/vending/billing/IInAppBillingService; or its super classes (declaration of 'com.android.vending.billing.IInAppBillingService' appears in /data/app/{MY_PAKAGE_NAME}-eHTcC-Sp4zY08KZcxkl7fQ==/base.apk:classes97.dex)
Run Code Online (Sandbox Code Playgroud)

BillingClientImpl.java:332

有任何想法吗?

java android google-play android-billing play-billing-library

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

在App Purchase中似乎被多次调用

我根据Google的教程使用Play Billing Library 1.0实现了应用程序内购买.我只有1件商品可以购买,当它解锁时,我会显示一个Toast.LENGTH_SHORT长度的Toast消息.然而,Toast在那里呆了10秒钟,所以我认为它被多次调用.当我通过queryPurchases(如果有人先前购买并在此期间重新安装应用程序)解锁时,它不会发生.

任何人都知道为什么Toast会停留这么久/为什么它被多次调用?

在我的BillingManager类中:

@Override
public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) {
    if (responseCode == BillingClient.BillingResponse.OK) {
        for (Purchase purchase : purchases) {
            handlePurchases(purchase);
        }
        mBillingUpdatesListener.onPurchasesUpdated(mPurchases);
    } else if (responseCode == BillingClient.BillingResponse.USER_CANCELED) {

    } else {

    }
}

public void handlePurchases(Purchase purchase) {
    //here could be validation on own server

    mPurchases.add(purchase);
}
Run Code Online (Sandbox Code Playgroud)

主Activity实现BillingUpdatesListener:

@Override
public void onPurchasesUpdated(List<Purchase> purchases) {
    for (Purchase purchase : purchases) {
        switch (purchase.getSku()) {
            case "premium":
                unlockPremium();
                break;
        }
    }
}

public void …
Run Code Online (Sandbox Code Playgroud)

android in-app-billing play-billing-library

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