我是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:无法添加窗口 - 令牌null不适用于应用程序。
在此处发布原始帖子之前,我联系了AppBucks支持。他们的反应(粘贴在下面)促使我创造了半透明的活动。:
我相信这个错误意味着您传递给AppBucksAPI.userOptOutDialog方法的第一个参数存在问题...来自文档的调用如下所示:
AppBucksAPI.userOptOutDialog(this, "<App Name>");
此调用需要将Activity或Activity上下文作为第一个参数。它需要这个,因为我们的默认退出对话框使用AlertDialog调用,这需要一个活动的Activity来正确显示它。如果您已经在服务中创建了一个Activity,那么您应该将该活动作为第一个参数而不是“this”传递(或者您可以将此调用移至该活动的onCreate而不是onCreate for the service)。
如果你的应用程序中没有Activity,我发现这个StackOverflow问题有一个可能有帮助的答案(简而言之,你可以在服务启动时创建一个透明的活动,并从中调用userOptOutDialog而不是你的服务的onCreate方法): Display AlertDialog as system overlay window from Service
不幸的是,上面的文章介绍了创建活动和关闭对话框,假设读取它的人可以访问对话框的代码。由于我无法访问它,因为它作为库导入到我的项目中,我需要知道如何从父活动中监听孩子完成。
我做了一些挖掘,看起来其中任何一个都可以工作,这取决于我的代码所做的对话框调用中活动的启动方式:
或
我今晚会试一试。
答案 0 :(得分:0)
查看AppBucks API和文档,我不认为使用Activity是强制性的。这只是最常见的方式。
我认为您也可以在服务onCreate中调用AppBucks方法?
答案 1 :(得分: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);
}
}
}
答案 2 :(得分:0)
AppBucks SDK还公开了以下功能:
setIconAdsEnabledForUser
setPushAdsEnabledForUser
AppBucksAPI.userOptOutDialog
基本上是一个便利函数,它在AlertDialog中包含对这些函数的调用。对于您的应用程序,放弃便利功能并编写自己的AlertDialog
直接调用启用功能可能更有意义。这样,您就可以完全控制对话框关闭时发生的事情,并可以在需要时关闭您创建的新活动。