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中,不幸的是,应用程序是由几个活动构建的,因此,我们无法从一个活动中停止应用程序。我的意思是说?我们有完成()方法,它将终止活动,但它不能关闭整个应用程序。因此,在终止应用程序的活动后,该应用程序的先前活动将显示。

所以,回到我的故事。例如 30 秒后(根据上面的代码)服务将运行我的主要活动。但是如果用户轻松点击返回按钮会发生什么?她/他可以回到应用程序的先前活动并继续他的使用。

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

你的建议是什么?无论如何不要让用户在到期后继续使用应用程序?

=======> 更新:

备查。我使用了FLAG_ACTIVITY_CLEAR_TOP并且问题解决了。现在,即使用户单击后退按钮,主要活动和最后活动之间的所有活动都将清除。根据其文档:

如果设置,并且正在启动的活动已经在当前任务中运行,那么不会启动该活动的新实例,而是关闭它上面的所有其他活动,并且此 Intent 将被传递到(现在顶部)作为新意图的旧活动。

例如,考虑一个由以下活动组成的任务:A、B、C、D。如果 D 调用 startActivity() 并带有一个解析为活动 B 的组件的 Intent,那么 C 和 D 将完成并且 B 接收给定的 Intent ,导致堆栈现在是:A,B。

4

1 回答 1

0

三种可能:

  1. 覆盖onBackPressed()什么也不做。
  2. 通过在最初启动它的那个上添加一个for来Activity完全从后面的堆栈中删除它。flagFLAG_ACTIVITY_NO_HISTORYIntent
  3. 提交一些数据并在用户返回时SharedPreferences检查它。onResume如果数据显示它已过期,则禁用您想要的任何功能。
于 2011-12-14T02:59:28.437 回答