0

Android開発初心者です。作成したライブ壁紙を収益化しようとしていますが、広告配信会社は、アクティビティの onCreate からコードを呼び出すように求めています。

ライブ壁紙には、収益化を開始する前はアクティビティがなく、WallpaperService の拡張機能だったので、1 つ追加しました。アクティビティを作成して半透明にすることはできましたが、ダイアログを閉じても閉じません。.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 にできる画面で LWP がクラッシュします。私が得るエラーは android.view.WindowManager$BadTokenException: Unable to add window -- token null はアプリケーション用ではありません。

ここに元の投稿をする前に、AppBucks のサポートに連絡しました。彼らの反応 (以下に貼り付け) により、半透明のアクティビティを作成するようになりました。

このエラーは、 AppBucksAPI.userOptOutDialog メソッドに渡す最初のパラメーターに問題があることを意味していると思います... ドキュメントからの次のような呼び出し:

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

この呼び出しは、Activity または Activity コンテキストを最初のパラメーターとして想定しています。これが必要なのは、デフォルトのオプトアウト ダイアログが AlertDialog 呼び出しを使用するためです。正しく表示するにはアクティブなアクティビティが必要です。サービスとともにアクティビティをすでに作成している場合は、「this」ではなく、そのアクティビティを最初のパラメーターとして渡す必要があります (または、この呼び出しをサービスの onCreate ではなく、そのアクティビティの onCreate に移動することもできます)。

アプリにアクティビティがない場合は、この StackOverflow question が役立つ可能性がある回答を見つけました (一言で言えば、サービスの起動時に透過的なアクティビティを作成し、代わりにそれから userOptOutDialog 呼び出しを行うことができます)。サービスの onCreate メソッド): Service からシステム オーバーレイ ウィンドウとして 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とドキュメントを見ると、アクティビティの使用は必須ではないと思います。これが最も一般的な方法です。

サービス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 に答える