1

我注意到不同 API 上的有趣活动行为:

  • API 21 及更高版本 - 当 Activity 进入 onPause 状态而某些视图显示在其顶部时(用户仍然可以看到某些部分的活动),它几乎立即进入 onStop 和 onDestroy。这些反应导致在顶视图上显示的强制关闭。
  • API 16 - 活动在相同情况下不进入 onDestroy。这就是为什么在顶视图上通常显示的原因。

那么问题是新的 android API 发生了什么变化?活动生命周期发生了哪些变化?

文档说:

在系统需要更多内存的情况下,它可能会终止暂停的进程以回收资源。

这可能是一种解释,但为什么在不同的 API 中执行我的代码时系统的行为会有所不同?

是否可以告诉系统我仍然需要我的活动?

我必须说我的应用程序执行繁重的任务。这是我的代码的一部分:

活动课

public class OverlayActivity extends Activity {

private static boolean isRunning = false;
private AdManager mManager;
public static void runActivity(Context context){
    if (isRunning)
        return;
    Intent intent = new Intent(context, OverlayActivity.class);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    getWindow().setLayout(-1, -1);
    super.onCreate(savedInstanceState);
    isRunning = true;
    Log.d("TAG", "OverlayActivity onCreate");
    mManager = new AdManager(this,"http://my.mobfox.com/request.php",
            "267d72ac3f77a3f447b32cf7ebf20673", true);
    mManager.setListener(new AdListener() {
        @Override
        public void adClicked() {
            Log.d("TAG", "AdListener adClicked");
        }

        @Override
        public void adClosed(Ad ad, boolean b) {
            Log.d("TAG", "AdListener adClosed");
            OverlayActivity.this.finish();
        }

        @Override
        public void adLoadSucceeded(Ad ad) {
        if (mManager != null && mManager.isAdLoaded())
            mManager.showAd();
        }

        @Override
        public void adShown(Ad ad, boolean b) {
            Log.d("TAG", "AdListener adShown");
        }

        @Override
        public void noAdFound() {
            Log.d("TAG", "AdListener noAdFound");
            OverlayActivity.this.finish();
        }
    });
    mManager.requestAd();
}

@Override
protected void onStart() {
    super.onStart();
    Log.d("TAG", "OverlayActivity onStart");
}

@Override
protected void onResume() {
    super.onResume();
    Log.d("TAG", "OverlayActivity onResume");
}

@Override
protected void onPause() {
    super.onPause();
    Log.d("TAG", "OverlayActivity onPause");
}

@Override
protected void onStop() {
    super.onStop();
    Log.d("TAG", "OverlayActivity onStop");
}

@Override
protected void onDestroy() {
    Log.d("TAG", "OverlayActivity onDestroy");
    isRunning = false;
    super.onDestroy();
    if (mManager!=null)
        mManager.release();
    mManager=null;
    }
}

清单声明

        <activity android:name=".OverlayActivity"
        android:excludeFromRecents="true"
        android:noHistory="true"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:finishOnTaskLaunch="true"/>

活动启动点

public class AdRequestReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {        
    OverlayActivity.runActivity(context);
    }
}

请给我一些有关可能导致这种不同活动行为的新 android API 更改的信息。

任何帮助将不胜感激。

4

0 回答 0