我一直在努力让应用程序级别暂停和恢复类似于活动的onPause和onResume。我知道没有具有此功能的API。
我尝试关注此帖:http://curioustechizen.blogspot.com/2012/12/android-application-level-pause-and.html
但到目前为止我没有运气。
有没有人能够做到这一点?你使用了什么样的范例?
如果您需要我将一些代码粘贴到此问题中,请告诉我。 谢谢你的帮助
答案 0 :(得分:6)
该问题的另一个解决方案是仅跟踪每个活动的onStart()和onStop()调用的计数。例如:
首先,创建一个类来保存计数:
public class ActiveActivitiesTracker {
private static int sActiveActivities = 0;
public static void activityStarted()
{
if( sActiveActivities == 0 )
{
// TODO: Here is presumably "application level" resume
}
sActiveActivities++;
}
public static void activityStopped()
{
sActiveActivities--;
if( sActiveActivities == 0 )
{
// TODO: Here is presumably "application level" pause
}
}
}
然后在每个活动中,只需调用activityStarted()和activityStopped()方法:
@Override
public void onStart() {
super.onStart();
ActiveActivitiesTracker.activityStarted();
}
@Override
public void onStop() {
super.onStop();
ActiveActivitiesTracker.activityStopped();
}
答案 1 :(得分:4)
我遇到了同样的问题。我的目的是锁定应用程序,如果用户放弃它。一个简单的目标,我认为这很容易实现。但我找到的所有解决方案都是复杂的。所以我找到了一个简单的解决方案:基于时间的锁定。
基本上它的工作原理如下:
因此我创建了一个小小的课程:
public class ApplicationLock {
private static final String TAG = ApplicationLock.class.getSimpleName();
private static final int LOCK_TIME = 1000; //lock after a second
private static boolean lock = true; //default is locked
private static Handler handler = new Handler();
private static Runnable runnable = new Runnable() {
@Override
public void run() {
lock = true;
Log.i("ActivityTracker", "App locked");
}
};
public static boolean activityStarted()
{
handler.removeCallbacks(runnable);
if(lock)
{
Log.i(TAG, "App resumed - LOCKED");
return true;
}else{
Log.i(TAG, "App resumed - NOT LOCKED");
return false;
}
}
public static void activityStopped()
{
handler.postDelayed(runnable, LOCK_TIME);
Log.i(TAG, "App paused - Starting countdown");
}
只需在onResume()中的活动onPause()和activityStarted()中调用activityStopped()即可。检查activityStarted()的结果。如果返回true,请锁定您的应用。如果更改了应用程序的方向,onOause后将很快调用onResume,因此应用程序不会锁定。
此解决方案可能并不适合所有情况,但就我而言,这是最佳解决方案。此外,您可以更改倒计时,以增加用户体验(用户按下错误按钮并在几秒钟内返回应用程序,无需锁定应用程序)。希望这对其他人有用。
答案 2 :(得分:1)
我在一个应用程序中做了类似于此的事情,该应用程序使用了通过多个活动提供GPS功能的服务。我们的想法是只在其中一个使用它的活动可见时才有服务,而当没有可见的时候就不存在。在您的情况下,每个活动都会挂钩到一个服务,您将通过挂钩到服务的onCreate()和onDestroy()方法来了解整个应用程序暂停或恢复的时间。
这是一个精简的例子:
需要的组件(如果你想重用它们,可能会将它们放入实用程序类中,或者我只为每个活动类使用它们):
private boolean mAppActiveServiceBound = false;
private AppActiveService mAppActiveService = null;
private ServiceConnection mAppActiveConnection = new ServiceConnection() {
public void onServiceConnected( ComponentName className, IBinder service ) {
mAppActiveService = ( (AppActiveService.AppActiveBinder) service ).getService();
}
public void onServiceDisconnected( ComponentName className ) {
mAppActiveService = null;
}
};
然后在每个活动的onStart()和onStop()方法中:
@Override
public void onStart() {
super.onStart();
mAppActiveServiceBound = bindService( new Intent( this, AppActiveService.class ), mAppActiveConnection, Context.BIND_AUTO_CREATE );
}
@Override
public void onStop() {
super.onStop();
if( mAppActiveServiceBound ) {
unbindService( mAppActiveConnection );
mAppActiveServiceBound = false;
}
}
最后,服务本身:
public class AppActiveService extends Service {
// Receives interactions from clients:
private final IBinder mBinder = new AppActiveBinder();
/**
* Provides a handle to the bound service.
*/
public class AppActiveBinder extends Binder {
AppActiveService getService() {
return AppActiveService.this;
}
}
@Override
public void onCreate(){
// TODO: Here is presumably "application level" resume
}
@Override
public void onDestroy(){
// TODO: Here is presumably "application level" pause
}
}