在我的应用程序中,我让用户根据不同的计划购买应用程序,例如 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。