さまざまな API で興味深いアクティビティの動作に気付きました。
- API 21 以降 - ビューがその上に表示されている間にアクティビティが 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 の変更について、いくつかの情報を教えてください。
どんな助けでも大歓迎です。