0

我是 Android 开发的新手。我正在尝试通过我制作的动态壁纸获利,而广告投放公司希望我从活动的 onCreate 中调用他们的代码。

动态壁纸在我开始通过它获利之前没有任何活动,它是 WallpaperService 的扩展,所以我添加了一个。我设法创建了活动并使其半透明,但是当对话框关闭时它并没有关闭。我无法编辑对话框代码,因为它是通过对 .jar 的调用创建的,所以我想我可以设置一个侦听器以在对话框被关闭时设置,但我找不到任何可能有助于解决问题的实际示例下面的代码。

LWP.java

public class SBLiveWallpaper extends WallpaperService {
    super.onCreate();
    Intent i = new Intent();
  //  i.setClass(this, MainActivity.class);
    i.setComponent(new ComponentName("appname", "appname.MainActivity")); 
  //  i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(i);
}

activity_main.xml 没有元素(只有 RelativeLayout)

MainActivity.java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    AppBucksAPI.initialize(this, APPID, "APIKEY", true, null, null);
    AppBucksAPI.userOptOutDialog(this, "marketname");
}

我可以使活动不透明,只需添加一个关闭按钮,但这很丑陋并且让用户感到困惑。

编辑澄清:我最初尝试直接从服务的 onCreate() 调用对话框。它会导致 LWP 在您可以将其设为活动 LWP 的屏幕中崩溃。我得到的错误是 android.view.WindowManager$BadTokenException: Unable to add window -- token null 不适用于应用程序。

在在这里发表原始帖子之前,我联系了 AppBucks 支持。他们的回应(粘贴在下面)促使我创建半透明活动。:

我相信这个错误意味着您传递给 AppBucksAPI.userOptOutDialog 方法的第一个参数有问题......从文档中看起来像这样的调用:

AppBucksAPI.userOptOutDialog(this, "<App Name>");

此调用需要 Activity 或 Activity 上下文作为第一个参数。它需要这个,因为我们的默认退出对话框使用 AlertDialog 调用,它需要一个活动的 Activity 才能正确显示。如果您已经与服务一起创建了 Activity,则应该将该 Activity 作为第一个参数而不是“this”传递(或者您可以将此调用移至该 Activity 的 onCreate 而不是服务的 onCreate)。

如果您的应用程序中没有活动,我发现这个 StackOverflow 问题的答案可能会有所帮助(简而言之,您可以在服务启动时创建一个透明活动,并从中调用 userOptOutDialog 而不是您的服务的 onCreate 方法): 将 AlertDialog 显示为来自服务的系统覆盖窗口

不幸的是,上面的文章在假设阅读它的人可以访问对话框的代码的情况下创建活动和关闭对话框。由于我无权访问它,因为它作为库导入到我的项目中,所以我需要知道如何从父活动中收听,以便孩子完成。

我做了一些挖掘,看起来这些中的任何一个都可以工作,这取决于活动是如何从我的代码生成的对话框调用开始的:

http://developer.android.com/reference/android/app/Activity.html#finishActivityFromChild(android.app.Activity , int)

或者

http://developer.android.com/reference/android/app/Activity.html#finishFromChild(android.app.Activity)

今晚我会试一试。

4

3 回答 3

0

查看 AppBucks API 和文档,我不认为使用 Activity 是强制性的。这只是最常见的方式。

我认为您也可以在服务 onCreate 中调用 AppBucks 方法吗?

于 2013-02-07T10:06:24.980 回答
0

关闭您的对话框时,向您的活动发送一个意图以使其自行关闭。

例如

把它放在对话框关闭方法中:

sendBroadcast(new Intent(MainActivity.ACTION_TERMINATE));

然后在 MainActivity 添加并注册一个 BroadcastReceiver:

在活动中为接收者和过滤器添加字段:

private ActivityBroadcastReceiver mReceiver;
static final IntentFilter mFilter = new IntentFilter();
static {mFilter.addAction(ACTION_TERMINATE);}

在 onCreate() 中实例化它:

mReceiver = new ActivityBroadcastReceiver();

在 onResume() 中注册它:

    registerReceiver(mReceiver, mFilter);

在 onPause() 中取消注册:

unregisterReceiver(mReceiver);

广播接收器在活动中的内部类看起来像这样

private class ActivityBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            String action = intent.getAction();
            if (ACTION_TERMINATE.equals(action)) {
                finish();
            }
        } catch (Exception e) {
            Log.w(mTag, "Oops: " + e, e);
        }
    }
}
于 2013-02-07T12:43:49.863 回答
0

AppBucks SDK 还公开了以下功能:

setIconAdsEnabledForUser
setPushAdsEnabledForUser

AppBucksAPI.userOptOutDialog基本上是一个方便的函数,它将对这些调用包装在一个 AlertDialog 中。对于您的应用程序,放弃便利功能并编写自己AlertDialog的直接调用启用功能的应用程序可能更有意义。这样,您将完全控制对话框关闭时发生的情况,并可以在需要时关闭您创建的新活动。

于 2013-02-08T15:25:59.640 回答