我注意到不同 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 更改的信息。
任何帮助将不胜感激。