2011-04-20 2 views
2

먼저, 내가 가지고있는 주된 질문에 도달하기 전에 먼저 내가 가진 상황을 설명하겠습니다. 첫째, 나는 내가 활동을 다루는 방식이 활동을 다루는 적절한 방법인지 알아 내고 싶다. 나는 이것이 문제가되는 방향으로 나아지지 않을 수도 있다고 생각한다.Android : 적절한 핸들링 방법

현재 3 가지 활동 설정이 있습니다. Main.class, Login.class 및 Display.class. Main 액티비티에는 이와 관련된 UI가 전혀 없으며 다른 액티비티를 시작합니다. 따라서 앱이 시작될 때 실행되는 첫 번째 활동은 기본 활동이며 SharedPreferences 상점에서 사용자가 로그인했는지 여부를 읽습니다. 로그인하지 않은 경우 로그인이 열립니다. 클래스에 로그인하면 Display.class가 열립니다 (둘 다 연관된 UI가 있습니다). startActivityForResult()를 사용합니다.

활동으로 작업하기로 결정했기 때문에 Login.class 및 Display.class에서 뒤로 버튼을 무시해야했습니다. 그렇지 않으면 Main.class로 돌아가 다시 실행됩니다. 실행중인 활동 순서. 실행중인 활동을 다시 시작합니다 (따라서 뒤로 버튼은 쓸모가 없습니다). 그래서, 나는 -1의 정수를 되돌려 보내고, 현재 활동을 끝내기 위해 뒤로 버튼을 무시했다. Main.class에 대해 onActivityResult (int, int, Intent)를 재정의하고 -1을 받으면 액티비티를 다시 시작하지 않고 finish()도 수행합니다.

자, 내가 그것을 원했던 방식으로, 비록 그것이 활동을 다루는 완전히 잘못된 방법이라는 생각이 들더라도, 그것은 나중에 트랙에 문제를 일으켰습니다.

내 응용 프로그램에서는 응용 프로그램 위젯과 알림을 넣기로 결정했습니다. 둘 중 하나를 클릭하면 (Main.class를 시작하는 의도를 통해) 응용 프로그램이 열립니다. 나는 새로운 활동을 시작하는 것이 문제를 일으키는 것처럼 보일지라도 그것이 그렇게 할 수 있도록 모든 일을해야한다.

기본적으로 응용 프로그램이 이미 실행 중이고 알림을 가져 와서 클릭하면 동일한 응용 프로그램의 새로운 활동이 열립니다. 이것은 문제가되는데, 특히 뒤로 버튼을 처리하는 방식에 문제가 있습니다. 새 버튼을 열었을 때 뒤로 버튼을 누르면 새 버튼이 닫히고 (예 : 예상대로) 이전 상태로 돌아갑니다. 그런 다음 뒤로 버튼을 다시 눌러 종료 할 수 있지만, 분명히 뒤로 버튼이 두 번 눌러야하는 앱을 출시하고 싶지 않습니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 문제의 주요 부분 인 경우 활동을 처리하는 방식을 완전히 바꿔 드리겠습니다.

감사합니다. Josh.

+0

+1 다시 생각 해보는 방법에 대한 좋은 토론입니다. 나는 활동의 상단에 응용 프로그램 클래스를 가지고이 문제를 해결하려고합니다. 아래 예를 게시했습니다. – Aleadam

답변

1

실제로 -1을 설정하고 괜찮 았는데 finish()를 호출하는 방법이 완벽하게 허용됩니다. 속성 값을 잊어 버렸지 만 활동의 단일 인스턴스 만 원하면 매니페스트에서이를 설정하는 방법이 있습니다 ... 작업 선호도 또는 그 값 중 하나 -이를 찾아야합니다.

대신 Application 클래스를 재정의하고 자신을 사용하여 응용 프로그램 상태를 관리 할 수 ​​있습니다. 그것을 주 활동을위한 싱글 톤 (singleton) 추적기라고 생각하십시오. "이미 존재한다면 그것을 사용하십시오, 그렇지 않으면 새로운 인스턴스를 생성하십시오"종류의 것. 메인 액티비티를 생성 할 때 새로 확장 된 Application 클래스에 레퍼런스를 설정합니다 (메인이 종료 될 때 이것을 널 (null)로 설정하십시오). 그런 다음 onCreate()가 다시 발생하면 참조가 사용 가능한지 확인하십시오. 이미 Main의 인스턴스를 사용하고 있습니다. 그렇지 않다면 정상적으로 진행하고 설정하십시오. 생각에 대한

식품 ...

+2

매니페스트를 변경해 주셔서 감사합니다. 나는 안드로이드를 넣는 것을 끝내었다 : launchmode = "singleTop"은 로그인과 디스플레이 (메인이 아님)를위한 태그 안에 있고 잘 돌아갔다. 처음에는 singleInstance를 시도했지만 어떤 이유로 setResult가 작동을 멈췄지만 동일한 문서가 전부 분리되어있었습니다. android dev 문서 링크 : http://developer.android.com/guide/topics/manifest/activity-element.html – joshhendo

+0

네 .. 재산의 이름을 기억하지 못했지만 그것에 대해 읽은 것을 기억합니다. . Windows CE 및 Windows Mobile 응용 프로그램에서 유사한 기능을 사용했습니다. 좋은 직장. – BonanzaDriver

1

나는 문제의 깊이를 충분히 이해하지 못한다고 생각합니다. 이미 시도한 것을 말하면 용서해주십시오.

메인을 제거하고 로그인을 로그인에서 시작할 수 없습니까? 제 말이 더 의미가 있습니다. 그게 내가 여기 주요 활동 (분명히 귀하의 경우에 표시됩니다)에 대한 데이터를 작성해야 액세서리 활동이 필요 할 때마다 여기에 무엇입니까. 로그인에서 돌아 오면 필요한 모든 검사를 수행 할 수 있습니다. "읽기 전용"디스플레이를 허용 할 수 있습니다 ...

많은 문제와 쓸모없는 코드를 실제로 저장합니다 (대부분의 결과/의도 스파게티).

+0

처음에 나는 그것이 좋은 방법이라고 생각했고, 나는 여전히 그것이라고 생각합니다. 내 생각으로는 다른 클래스의 ontop을 만드는 대신 setResult()를 통해 모든 것을 시작하는 Main 클래스를 가질 수있었습니다. 작은 응용 프로그램에서, 당신의 방법은 아마도 더 좋을 것입니다. 나는이 응용 프로그램을 다시하거나 다른 유사한 응용 프로그램을 만들면 그렇게 할 수 있습니다. 감사! – joshhendo

+0

당신을 진심으로 환영합니다. 다행스럽게도 작동하게 된 것을 발견했습니다. singleTop, singleTask, singleInstance에 대해 많이 알지 못했습니다. 여기에 게시 해 주셔서 감사합니다. – davidcesarino

1

실현 가능한 접근 방식은 Application를 확장하는 클래스와 바인드 Activity의 몇을하는 것입니다. private boolean logged 값은 DisplayLogIn을 포 그라운드로 호출해야하는지 여부를 판별 할 수 있습니다.

public class MyApp extends Application { 
    private static boolean logged = false; 
    private Activity logInActivity; 
    private Activity displayActivity; 
    public void onCreate() { 
     super.onCreate(); 
    } 
    public void setDisplayActivity (Activity act) { 
     displayActivity = act; 
    } 
    public void setLogInActivity (Activity act) { 
     logInActivity = act; 
    } 
    public void finishActivities (Activity act) { 
     activity.finish(); 
    } 
    public void setLogged (boolean logged) { 
     this.logged = logged; 
    } 
    public boolean isLogged() { 
     return logged; 
    } 
    public Activity getLoginActivity() { 
     return logInActivity; 
    } 
    public Activity getDisplayActivity() { 
     return displayActivity; 
    } 
} 

class Display extend Activity { 
    private MyApp app; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     app = (MyApp) getApplicationContext(); 
     if (!app.isLogged()) { 
      // start LogInActivity. After log in, it will call app.setLogged (true); 
     } 
     else { 
      // continue with Display; 
     } 
    } 
} 
+0

내가 전에 가지고 있었던 방법은 명확히. 제안을 해주셔서 고맙습니다. 저는 Android 개발에 새로운 경험이 있으므로 활동, 의도, 응용 프로그램 등이 모두 어떻게 작동하는지 꽤 많이 배우고 있습니다. 나는 확실히 내 다음 안드로이드 애플 리케이션을 참조하십시오. – joshhendo

관련 문제