Android:“应用程序级别”暂停和恢复

时间:2014-01-03 20:32:51

标签: onresume onpause android

我一直在努力让应用程序级别暂停和恢复类似于活动的onPause和onResume。我知道没有具有此功能的API。

我尝试关注此帖:http://curioustechizen.blogspot.com/2012/12/android-application-level-pause-and.html

但到目前为止我没有运气。

有没有人能够做到这一点?你使用了什么样的范例?

如果您需要我将一些代码粘贴到此问题中,请告诉我。 谢谢你的帮助

3 个答案:

答案 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)

我遇到了同样的问题。我的目的是锁定应用程序,如果用户放弃它。一个简单的目标,我认为这很容易实现。但我找到的所有解决方案都是复杂的。所以我找到了一个简单的解决方案:基于时间的锁定。

基本上它的工作原理如下:

  • 开始倒计时以锁定onPause中的应用
  • onResume
  • 停止倒计时
  • 如果未及时调用onResume,请更改为已锁定

因此我创建了一个小小的课程:

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
    }
}