안 드 로 이 드 연속 클릭 에 여러 개의 Activity 인터페이스 가 나타 나 는 해결 방법

머리말
안 드 로 이 드 를 배우 기 시 작 했 습 니 다.안 드 로 이 드 의 시작 모델 에 대해 아무것도 모 르 고 시간 을 사용 하여 두 번 의 단 추 를 중복 클릭 했 는 지 여 부 를 판단 하고 다른 activity 인터페이스 를 시작 합 니 다.이런 제어 방법 은 가끔 효력 을 잃 을 수 있 습 니 다.예 를 들 어 2 초 동안 다른 activity 를 시작 하지 않 으 면 중복 클릭 할 수 있 습 니 다.따라서 안 드 로 이 드 의 시작 모드 로 조정 하여 여러 개의 acitivity 가 반복 되 는 것 을 제어 합 니 다.
1.시간 을 통 해 클릭 횟수 조절:
이런 방식 은 제어 네트워크 요청 에 대응 하 는 것 이 좋다.

public class NoDoubleClickUtil {
  private static long lastClickTime;
  private final static int SPACE_TIME =2000;

  public static void initLastClickTime() {
    lastClickTime = 0;
  }

  public synchronized static boolean isDoubleClick() {
    long currentTime = System.currentTimeMillis();
    boolean isClickDouble;
    if (currentTime - lastClickTime >
        SPACE_TIME) {
      isClickDouble = false;
    } else {
      isClickDouble = true;
    }
    lastClickTime = currentTime;
    return isClickDouble;
  }
}
2.launchMode 시작 모드 를 통 해 여러 activity 가 나타 나 는 방식 을 제어 합 니 다.
이런 방식 은 진정한 의미 에서 같은 여러 개의 activity 가 동시에 나타 나 는 것 을 근절 했다.
android:launchMode="singleInstance"/>
또는 코드 에 설정:

Intent intent = new Intent();
intent.setClass(getApplicationContext(), TargetActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
3.안 드 로 이 드 의 네 가지 시작 모드:
1.standard 모드:startActivity()를 호출 할 때마다 스 택 꼭대기 에 새 Activity 를 만 듭 니 다.(기본 값 은 이 모드 입 니 다)
2.singleTop 모드:Activity 를 시작 할 때 Activity 가 스 택 꼭대기 에 없 으 면 만 듭 니 다.예 를 들 어 스 택 꼭대기 에 있 으 면 만 들 지 않 습 니 다(같은 Activity 가 서로 인접 하지 않 습 니 다)
3.singleTask 모드:시작 하 는 Activity 가 존재 하지 않 으 면 Activity 를 만 듭 니 다.지정 한 Activity 가 있 는 위치 로 바로 이동 합 니 다.(그 위 에 있 는 Activity 는 스 택 에서 이동 합 니 다.즉,스 택 에 중복 되 는 Activity 가 있 으 면 안 됩 니 다)
4.singleInstance 모드:시작 하 는 Activity 가 존재 하지 않 으 면 Activity 를 만 들 고 스 택 을 만 듭 니 다.존재 하면 지정 한 Activity 가 존재 하 는 스 택 을 스 택 으로 이동 합 니 다.(이 Activity 는 하나의 독립 된 작업 스 택 에 만 존재 할 수 있 고 다른 Activity 와 무관 하 다 는 뜻)
추가 지식:Android 에서 여러 Activity 를 종료 하 는 두 가지 전형 적 인 방법
하 나 는 모든 activity 를 집합 으로 기억 하고 하나씩 제거 합 니 다.또 다른 사고방식 은 방송 을 사용 하 는 것 이다.
방법 1.list 로 activity 인 스 턴 스 를 저장 한 다음 하나씩 제거 합 니 다.
activity 를 저장 하기 위해 외부 클래스 계승 애플 리 케 이 션 을 만 듭 니 다.

public class MyActvity extends Application {
  //      ,    activity   
  ArrayList<Activity>list=new ArrayList<>();
  //         
  private static MyActvity instance;
  public MyActvity() {
  }
  //      ,     MyActivity   ,           
  public synchronized static MyActvity getInstance(){
    if (instance==null){
      instance=new MyActvity();
    }
    return instance;
  }
  //              activity  
  public void addActivity(Activity activity){
    list.add(activity);
  }
  //  activity         
  public boolean isexitlist(Activity activity){
    if (list.contains(activity)){
      return true;
    }
    return false;
  }
  //         ,     activity
  public void exit(){
    for (Activity activity:list){
      activity.finish();
    }
    //     MyActivity
    System.exit(0);
  }

  @Override
  public void onLowMemory() {
    super.onLowMemory();
    //             ,          ,       
    System.gc();
  }
}
Activity 1 코드:

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //    activity 
    MyActvity instance = MyActvity.getInstance();
    //    activity      activity,      
    if (!instance.isexitlist(this)){
      instance.addActivity(this);
    }
    Intent intent = new Intent(this, Main2Activity.class);
    startActivity(intent);
  }
}
Activity 2 코드:

public class Main2Activity extends Activity {

  private MyActvity instance;

  /**
   * Called when the activity is first created.
   */

  @Override+
    super.onCreate(savedInstanceState);
    setContentView(R.layout.sdfa);
    Button bt= (Button) findViewById(R.id.bt);
    instance = MyActvity.getInstance();
    if (!instance.isexitlist(this)){
      instance.addActivity(this);
    }
    bt.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      //  exit()        activity
        instance.exit();
      }
    });

  }
}
방법 2.방송 을 이용 하여 activity 에 방송 을 등록 하고 소각 시 방송 을 시작 합 니 다.
MainActivity 에 라디오 등록:

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent intent = new Intent(this, Main2Activity.class);
    startActivity(intent);
    //    
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(Define.PAHNAME);
    registerReceiver(new MyReceiver(),intentFilter);
  }
  class MyReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
      unregisterReceiver(this);
      ((Activity)context).finish();
    }
  }
}
activity 2:방송 시작

public class Main2Activity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.sdfa);
    Button bt= (Button) findViewById(R.id.bt);
    bt.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Intent intent = new Intent(Define.PAHNAME);
        sendBroadcast(intent);
        finish();
      }
    });

  }
}
안 드 로 이 드 가 연속 클릭 하여 여러 개의 Activity 인터페이스 가 나타 나 는 해결 방법 은 바로 편집장 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저희 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기