728x90

최초 작성일 : 2017.7.18


@Override
public boolean onKeyDown(int keyCode, KeyEvent event){
  if ( event.getAction() == KeyEvent.ACTION_DOWN ){
      if ( keyCode == KeyEvent.KEYCODE_BACK ){
          AlertDialog.Builder alert_confirm = new AlertDialog.Builder(Main.this);
          alert_confirm.setMessage("프로그램을 종료 하시겠습니까?")
          .setCancelable(false)
          .setPositiveButton("종료",
          new DialogInterface.OnClickListener() {
              @Override
              public void onClick(DialogInterface dialog, int which) {
                  // 'YES'
                  finish();
              }
          }).setNeutralButton("취소",
          new DialogInterface.OnClickListener() {
              @Override
              public void onClick(DialogInterface dialog, int which) {                 
                  //finish();
              }
          }).setNegativeButton("백그라운드",
          new DialogInterface.OnClickListener() {
              @Override
              public void onClick(DialogInterface dialog, int which) {
                  // 'No'
                  System.out.println("백그라운드 상태로 동작합니다");
                  Intent intent = new Intent();
                  intent.setAction(Intent.ACTION_MAIN);
                  intent.addCategory(Intent.CATEGORY_HOME);
                  startActivity(intent);
              return;
              }
          });
          AlertDialog alert = alert_confirm.create();
          alert.show();
      }
      if ( keyCode == KeyEvent.KEYCODE_HOME ){
         
      }
  }
  return super.onKeyDown(keyCode, event);
}


인터넷에서 찾아서 사용해본 종료에 대한 메소드다.

과연 제대로 종료가 되는지 다른 어플에서 테스트를 해보니 어플이 완전 종료되지 않았다.

finish(); : 현재 Activity 종료



Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);


어플 종료라기 보다는 홈화면이 나오도록 하는 코드다.

어플이 종료되어 있는지 확인하면 종료되지 않고 남아있더라.


폭풍검색을 해서 찾아보니 어플 완전종료는 정말 쉽지 않더라.


'기본적'으로 안드로이드에는 '어플리케이션 종료' 라는 개념 자체가 없다.
한 번 실행된 프로세스는 메모리가 허락하는 한 영원히 죽지 않는다. 


http://m.blog.daum.net/creazier/15309783 에 관련 내용이 비교적 잘 정리되어 있다.

좀 오래된 내용이라 현재 기준 안드로이드에서 잘 동작하는지 여부는 아직 테스트를 못해봤다.


activity .finish(); // 현재 Activity 만 종료 처리
android.os.Process.killProcess(android.os.Process.myPid());

하면 종료될 것이라고 해서 테스트해보면 죽지 않고 좀비처럼 다시 살아난다. ㅠㅠ

Activity 가 1개만 떠있는 경우에만 정상적으로 죽는다고 하던데, 다른 Activity 를 실행하지 않은 상태에서도 테스트해보면 죽지 않고 살아 있더라.


어플 완전 종료가 되는 걸 찾게되면 수정해서 작성하련다. (2017.8.23)


드디어 완전하게 처리되는 걸 찾아냈다. (2017.8.31)

정말 우연히 Audio Player 종료처리하는 걸 테스트하다가 완전 종료되는 걸 확인했다.


if (Build.VERSION.SDK_INT >= 21)
    finishAndRemoveTask();
else
    finish();
System.exit(0);


안드로이드 스튜디오에서 컴파일하는 API 가 21보다 큰 경우인데 계속 예전 버전 종료인 finish(); 로만 처리를 하고 있었던 거다.

위 코드를 넣고 처리하니까 화면상에 남아있지 않았다.


finishAffinity()
Finish this activity as well as all activities immediately below it in the current task that have the same affinity.

finishAndRemoveTask()
Call this when your activity is done and should be closed and the task should be completely removed as a part of finishing the root activity of the task.

블로그 이미지

Link2Me

,
728x90
SQLiteDB에 있는 자료를 읽어서 HashMap 메모리 상에 올리는 예제이다.

HashMap<String, SQLite_Item> sqliteDBMap = new HashMap<String, SQLite_Item>();
public void SQLiteDB2ArrayList(){
    sqliteDBMap.clear(); // 메모리 초기화
    sqLiteDBHandler = new SQLiteDBHandler(Main.this);
    
    SQLiteDatabase db = sqLiteDBHandler.getReadableDatabase();
    db.beginTransaction();
    
    Cursor cursor = sqLiteDBHandler.LoadSQLiteDBCursor();
    try {
        cursor.moveToFirst();
        System.out.println("SQLiteDB 개수 = " + cursor.getCount());
        while (!cursor.isAfterLast()) {
            SQLite_Item item = new SQLite_Item();
            item.setIdx(cursor.getString(0));
            item.setUserNM(cursor.getString(1));
            item.setMobileNO(cursor.getString(2));
            item.setTelNO(cursor.getString(3));
            item.setTeam(cursor.getString(4));
            item.setPosition(cursor.getString(5));
            item.setCheckState(cursor.getInt(6));
            // HashMap 에 추가
            sqliteDBMap.put(cursor.getString(0), item);
            cursor.moveToNext();
        }
        db.setTransactionSuccessful();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        cursor.close();
        db.endTransaction();
    }        
}


sqLiteDBHandler = new SQLiteDBHandler(context); // BroadcastReceiver 에서 사용할 때


블로그 이미지

Link2Me

,