3

私のアプリケーションでは、2時間無料、1日、1週間など、さまざまなプランに基づいてユーザーにアプリケーションを購入させています。

有効期限が切れた後は、ユーザーにアプリケーションを使用させたくありません。私はサービスを作成し、メインアクティビティにアラームを設定しました。サービスでは、有効期限が切れたらメインアクティビティを開くように指示しました。

メインアクティビティでアラームを設定するコード:

private void updateService(){
        Intent myIntent = new Intent(DRMActivity.this, AlarmService.class);
        pendingIntent = PendingIntent.getService(DRMActivity.this, 0, myIntent, 0);

        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.SECOND, 30);
        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

        Toast.makeText(DRMActivity.this, "Start Alarm", Toast.LENGTH_LONG).show();
    }

サービスコード:

@Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);

        Intent myIntent = new Intent(getBaseContext(), DRMActivity.class);
        myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        Toast.makeText(this, "AlarmService.onStart()", Toast.LENGTH_LONG).show();

        getApplication().startActivity(myIntent);
    }

これまでのところ、私のメインアクティビティが破棄されても、サービスはそれを再度実行できます。しかし、Androidでは、残念ながら、アプリケーションはいくつかのアクティビティから構築されていると思います。したがって、アクティビティからアプリケーションを停止することはできません。私が意味したのは?アクティビティを終了するfinish()メソッドがありますが、アプリケーション全体を閉じることはできません。したがって、アプリケーションのアクティビティを終了した後、そのアプリケーションの以前のアクティビティが表示されます。

では、私の話に戻りましょう。たとえば、30秒後(上記のコードによる)、サービスは私のメインアクティビティを実行します。しかし、ユーザーが簡単に戻るボタンをクリックするとどうなりますか?以前のアプリケーションのアクティビティに戻って、使用を続けることができます。

良い提案の1つは、共有設定を作成し、サービス中にフラグを変更し、各アクティビティのonStart()でそれをチェックすることです。私はそれが機能すると思いますが、悪いことは、他のプロジェクトに追加する必要があるラッパーに取り組んでおり、他の開発者にこれを追加したり確認したりすることはできません。

あなたの提案は何ですか?とにかく、有効期限が切れた後もユーザーがアプリケーションを使い続けないようにする方法はありますか?

=======> 更新:

将来の参考のために。FLAG_ACTIVITY_CLEAR_TOPを使用しましたが、問題は解決しました。これで、ユーザーが戻るボタンをクリックしても、メインアクティビティと最後のアクティビティの間のすべてのアクティビティがクリアされます。そのドキュメントによると:

設定されていて、起動中のアクティビティが現在のタスクですでに実行されている場合、そのアクティビティの新しいインスタンスを起動する代わりに、その上にある他のすべてのアクティビティが閉じられ、このインテントが(現在top)新しいインテントとしての古いアクティビティ。

たとえば、アクティビティA、B、C、Dで構成されるタスクについて考えてみます。DがアクティビティBのコンポーネントに解決されるインテントを使用してstartActivity()を呼び出すと、CとDは終了し、Bは指定されたインテントを受け取ります。 、結果としてスタックは次のようになります:A、B。

4

1 に答える 1

0

3つの可能性:

  1. onBackPressed()何もしないようにオーバーライドします。
  2. 最初に開始したにforをActivity追加して、バックスタックから完全に削除します。flagFLAG_ACTIVITY_NO_HISTORYIntent
  3. 一部のデータをコミットし、ユーザーが戻ったときにSharedPreferencesチェックインします。onResumeデータに有効期限が切れていることが示されている場合は、必要な機能を無効にします。
于 2011-12-14T02:59:28.437 に答える