Androidは、複数のActivityが呼び出されたアプリケーションをどのように使用するか
9779 ワード
背景:
例1:あるソフトウェアが反対側に登録されている場合、現在のログインはXXX時間XXにログインするようユーザーに要求し、現在のインタフェースは破棄され(前の開いたインタフェースも破棄される)、最後にログインインタフェースにジャンプする.
例2:インタラクションでは、多くのインタフェースを開くかもしれませんが、今トップページに戻るときは、1つずつ返さなければなりません.このとき、インタラクションをより友好的にするために、直接トップページに戻る機能が加わり、前の開いたページは正常に退けなければなりません.
例3:登録プロセスでは、Aインタフェース(トップページ面)で登録をクリックし、B,C,Dインタフェースで登録が完了すると、B,C,Dは破壊されますが、Dに登録が成功しない場合(Aインタフェースに戻らない場合)は、B,C,Dは破壊されません.
この場合,Activityを安全に終了する方法を考える必要がある.
具体的な方案:
1.開いているActivityを記録し、終了が必要な場合は閉じるactivityを閉じる
2.特定の放送を送信し、放送のactivityを受信して閉じる
3.intentのflagにより実現する、intentを実現する.setFlags(Intent.FLAG_ACTIVTY_TOP)は、新しいactivityをアクティブにします.タスクスタックにactivityがすでに存在する場合、システムはこのactivityの上のすべてのActivityを破棄します.
ここでは主に第1の案を紹介します.
手順:
1.アプリケーションを作成し、すべてのactivityセットを管理するためのリストを作成し、リストの追加と破棄を担当する
2.ベースクラスとしてBaseActivityを確立し、サブクラスが継承されると、activityが追加されるたびにリストに追加されます.
3.MainActivityの実装:
5.SecondActivityインタフェース:go_mainは最初のインタフェースに戻ります
特にactivityを手動で管理する必要はありません.destroyを実行するとactivityが回収されるので、メモリの漏洩がないことを前提としています.
例1:あるソフトウェアが反対側に登録されている場合、現在のログインはXXX時間XXにログインするようユーザーに要求し、現在のインタフェースは破棄され(前の開いたインタフェースも破棄される)、最後にログインインタフェースにジャンプする.
例2:インタラクションでは、多くのインタフェースを開くかもしれませんが、今トップページに戻るときは、1つずつ返さなければなりません.このとき、インタラクションをより友好的にするために、直接トップページに戻る機能が加わり、前の開いたページは正常に退けなければなりません.
例3:登録プロセスでは、Aインタフェース(トップページ面)で登録をクリックし、B,C,Dインタフェースで登録が完了すると、B,C,Dは破壊されますが、Dに登録が成功しない場合(Aインタフェースに戻らない場合)は、B,C,Dは破壊されません.
この場合,Activityを安全に終了する方法を考える必要がある.
具体的な方案:
1.開いているActivityを記録し、終了が必要な場合は閉じるactivityを閉じる
2.特定の放送を送信し、放送のactivityを受信して閉じる
3.intentのflagにより実現する、intentを実現する.setFlags(Intent.FLAG_ACTIVTY_TOP)は、新しいactivityをアクティブにします.タスクスタックにactivityがすでに存在する場合、システムはこのactivityの上のすべてのActivityを破棄します.
ここでは主に第1の案を紹介します.
手順:
1.アプリケーションを作成し、すべてのactivityセットを管理するためのリストを作成し、リストの追加と破棄を担当する
public class MyApplication extends Application {
// activity
List ActivityList = new ArrayList<>();
// activity
public BaseActivity LastBaseActivity;
// activity
public void addActivity(BaseActivity activity){
if(!ActivityList.contains(activity)){
ActivityList.add(activity);
}
}
// activity
public void removeActivity(BaseActivity activity){
if(ActivityList.contains((activity))){
ActivityList.remove(activity);
}
}
// activity
public void clearALLActivity(){
LastBaseActivity = ActivityList.get(ActivityList.size()-1);
for(int i = 0;i
2.ベースクラスとしてBaseActivityを確立し、サブクラスが継承されると、activityが追加されるたびにリストに追加されます.
public abstract class BaseActivity extends AppCompatActivity {
public MyApplication myApplication;
// activity
public interface exitlastListener{
void exitlast();
}
private exitlastListener mexitlastListener;
public void setexitlastListener(exitlastListener mexitlastListener){
this.mexitlastListener = mexitlastListener;
}
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
initContentView(savedInstanceState);
myApplication = (MyApplication)this.getApplication();
// activity activity
myApplication.addActivity(this);
}
// j
protected abstract void initContentView(Bundle savedInstanceState);
@Override
protected void onDestroy(){
super.onDestroy();
myApplication.removeActivity(this);
if(myApplication.LastBaseActivity == this){
mexitlastListener.exitlast();
}
}
// activity
protected String getActivitynumber(Activity context){
ActivityManager manager = (ActivityManager)context.getSystemService(ACTIVITY_SERVICE) ;
List runningTaskInfos = manager.getRunningTasks(1) ;
if(runningTaskInfos != null){
return " Activity " +runningTaskInfos.get(0).numActivities;
}else{
return null;
}
}
}
3.MainActivityの実装:
public class MainActivity extends BaseActivity {
private String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LogManager.Log(TAG+"--onCreate");
TextView text_main = (TextView)findViewById(R.id.text_main);
text_main.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,FirstActivity.class));
}
});
}
@Override
protected void initContentView(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event){
if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){
// ,activity onStop,
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
Toast.makeText(MainActivity.this,"1111",Toast.LENGTH_SHORT).show();
return false;
}else{
Toast.makeText(MainActivity.this,"2222",Toast.LENGTH_SHORT).show();
// return true;
return super.onKeyDown(keyCode, event);
}
}
@Override
protected void onResume(){
super.onResume();
LogManager.Log(TAG+"--onResume");
}
@Override
protected void onStart(){
super.onStart();
LogManager.Log(TAG+"--onStart");
}
@Override
protected void onPause(){
super.onPause();
LogManager.Log(TAG+"--onPause");
}
@Override
protected void onStop(){
super.onStop();
LogManager.Log(TAG+"--onStop");
}
@Override
protected void onDestroy(){
super.onDestroy();
LogManager.Log(TAG+"--onDestroy");
}
}
4.FirstActivityインタフェース:public class FirstActivity extends BaseActivity {
private String TAG = "FirstActivity";
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
LogManager.Log(TAG+"--onCreate");
TextView text_first = (TextView)findViewById(R.id.text_first);
text_first.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(FirstActivity.this,SecondActivity.class));
}
});
}
@Override
protected void onStart(){
super.onStart();
LogManager.Log(TAG+"--onStart");
}
@Override
protected void onResume(){
super.onResume();
LogManager.Log(TAG+"--onResume");
}
@Override
protected void onPause(){
super.onPause();
LogManager.Log(TAG+"--onPause");
}
@Override
protected void onStop(){
super.onStop();
LogManager.Log(TAG+"--onStop");
}
@Override
protected void onDestroy(){
super.onDestroy();
LogManager.Log(TAG+"--onDestroy");
}
@Override
protected void initContentView(Bundle savedInstanceState) {
setContentView(R.layout.activity_first);
}
}
5.SecondActivityインタフェース:go_mainは最初のインタフェースに戻ります
public class SecondActivity extends BaseActivity {
private String TAG = "SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
LogManager.Log(TAG+"--onCreate");
Log.d("debug ",getActivitynumber(SecondActivity.this));
TextView text_gomain = (TextView)findViewById(R.id.text_gomain);
TextView text_exit = (TextView)findViewById(R.id.text_exit);
text_gomain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(SecondActivity.this,FirstActivity.class));
Log.d("debug ",getActivitynumber(SecondActivity.this));
myApplication.topActivity();
}
});
text_exit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
@Override
protected void onStart(){
super.onStart();
LogManager.Log(TAG+"--onStart");
}
@Override
protected void onResume(){
super.onResume();
LogManager.Log(TAG +"--onResume");
}
@Override
protected void onPause(){
super.onPause();
LogManager.Log(TAG+"--onPause");
}
@Override
protected void onStop(){
super.onStop();
LogManager.Log(TAG+"--onStop");
}
@Override
protected void onDestroy(){
super.onDestroy();
LogManager.Log(TAG+"--onDestroy");
}
@Override
protected void initContentView(Bundle savedInstanceState) {
setContentView(R.layout.activity_second);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
// //
// myApplication.clearALLActivity();
// setexitlastListener(new exitlastListener() {
// @Override
// public void exitlast() {
// // 2
// android.os.Process.killProcess(android.os.Process.myPid());
// }
// });
//
//// Intent intent = new Intent(getApplicationContext(),MainActivity.class);
//// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// activity , activity,
//// startActivity(intent);
// return true;
// } else {
// return super.onKeyDown(keyCode, event);
// }
return super.onKeyDown(keyCode, event);
}
}
特にactivityを手動で管理する必要はありません.destroyを実行するとactivityが回収されるので、メモリの漏洩がないことを前提としています.