Android 如何做';到期后不允许用户使用应用程序?

Android 如何做';到期后不允许用户使用应用程序?,android,time-trial,Android,Time Trial,在我的应用程序中,我允许用户根据不同的计划购买应用程序,例如2小时免费、1天免费、1周免费等等 我不想让用户在到期后使用该应用程序。我创建了一个服务,并在主活动中设置了警报,在服务中,我已经告诉您在到期后打开主活动 主活动中设置报警的代码: private void updateService(){ Intent myIntent = new Intent(DRMActivity.this, AlarmService.class); pendingIntent =

在我的应用程序中,我允许用户根据不同的计划购买应用程序,例如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秒后(根据上述代码),服务将运行我的主要活动。但若用户轻松点击后退按钮会发生什么呢?他/她可以回到以前的应用程序活动并继续使用

一个很好的建议是创建共享首选项,在服务中我更改一个标志,并在每个活动的onStart()中检查它。我认为它是可行的,但糟糕的是我正在编写一个包装器,它应该被添加到其他项目中,我不能要求其他开发人员添加这个或检查那个

你有什么建议?是否有任何方法不允许用户在到期后继续使用应用程序

==========> 更新:

供日后参考。我用了,问题解决了。现在,即使用户单击后退按钮,主活动和最后一个活动之间的所有活动都将清除。根据其文件:

如果已设置,则正在启动的活动已在中运行 当前任务,而不是启动该任务的新实例 活动,其上的所有其他活动都将关闭,并且 此意图将作为一个整体传递给(现在位于顶部)旧活动 新的意图

例如,考虑一个由活动组成的任务:A、B、C、D. 如果D调用startActivity()的目的是解决 活动B的组件,然后C和D将完成,B将收到 给定的意图,导致堆栈现在为:A,B

三种可能性:

  • 重写
    onBackPressed()
    以不执行任何操作
  • 通过向最初启动它的
    Intent
    添加
    flag\u Activity\u NO\u HISTORY
    标志,将该
    Activity
    从后堆栈中删除
  • 将一些数据提交到
    SharedReferences
    ,并在用户返回时在
    onResume
    中进行检查。如果数据显示它已过期,则禁用您想要的任何功能

  • 谢谢亲爱的LuxuryMode。你的第二个建议真的很有用,但是我用了Flag\u ACTIVITY\u CLEAR\u TOP来代替这个标志,这在我的例子中更合适。