android:从服务开始隐藏和销毁活动

android:从服务开始隐藏和销毁活动,android,android-activity,android-dialog,Android,Android Activity,Android Dialog,我是Android开发新手。我正试图将我制作的一张实时壁纸赚钱,广告发布公司希望我在创建活动时调用他们的代码 在我开始赚钱之前,LiveWallper没有任何活动,它是WallperService的一个扩展,所以我添加了一个。我已成功创建活动并使其半透明,但对话框关闭时它不会关闭。我无法编辑对话框代码,因为它是通过调用.jar创建的,所以我想我可以在对话框被取消时设置一个侦听器,但我找不到任何可能有助于下面代码的实际示例 LWP.java public class SBLiveWallpaper

我是Android开发新手。我正试图将我制作的一张实时壁纸赚钱,广告发布公司希望我在创建活动时调用他们的代码

在我开始赚钱之前,LiveWallper没有任何活动,它是WallperService的一个扩展,所以我添加了一个。我已成功创建活动并使其半透明,但对话框关闭时它不会关闭。我无法编辑对话框代码,因为它是通过调用.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不适用于应用程序

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

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

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

不幸的是,上面的文章介绍了创建活动和关闭对话框,前提是阅读活动的人可以访问对话框的代码。因为我没有访问权限,因为它是作为库导入到我的项目中的,所以我需要知道如何从父活动中侦听,以便子活动完成

我做了一些挖掘,看起来这两种方法中的任何一种都可以起作用,这取决于从我的代码调用的对话框开始活动的方式:

,int)


今晚我将尝试一下。

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


我认为您也可以在创建时在服务中调用AppBucks方法?

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

比如说

将其放入对话框中,然后单击“关闭”方法:

sendBroadcast(new Intent(MainActivity.ACTION_TERMINATE));
然后在Main活动中添加并注册广播接收器:

在“活动”中为收件人和筛选器添加字段:

private ActivityBroadcastReceiver mReceiver;
static final IntentFilter mFilter = new IntentFilter();
static {mFilter.addAction(ACTION_TERMINATE);}
在onCreate()中实例化它:

在onResume()中注册它:

在onPause()中注销它:

活动中广播接收器的内部类将如下所示

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);
        }
    }
}

AppBucks SDK还公开了以下功能:

setIconAdsEnabledForUser
setPushAdsEnabledForUser

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

正如我提到的,我无法访问对话框代码,因此这是不可能的。是否有任何方法可以使侦听器或广播接收器在更全局的级别上工作,可能是通过获取对话框活动本身的句柄?如果我可以侦听对于要销毁的活动,可以从父活动(我创建的透明活动)中调用finish()在我自己的活动中,当我看到孩子被销毁时。您好,谢谢。我更新了我的原始问题。我最初尝试过,但它导致LWP崩溃,错误为:android.view.WindowManager$BadTokenException:无法添加窗口--标记null不适用于应用程序。
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);
        }
    }
}
setIconAdsEnabledForUser
setPushAdsEnabledForUser