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

时间:2013-02-07 09:58:00

标签: android android-activity android-dialog

我是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

不幸的是,上面的文章介绍了创建活动和关闭对话框,假设读取它的人可以访问对话框的代码。由于我无法访问它,因为它作为库导入到我的项目中,我需要知道如何从父活动中监听孩子完成。

我做了一些挖掘,看起来其中任何一个都可以工作,这取决于我的代码所做的对话框调用中活动的启动方式:

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)

我今晚会试一试。

3 个答案:

答案 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直接调用启用功能可能更有意义。这样,您就可以完全控制对话框关闭时发生的事情,并可以在需要时关闭您创建的新活动。