2014-10-01 1 views
2

시간 초과 알림을 구현하려고합니다. 여기 내가하고 싶은 것이있다. 앱이 배경 분위기로 전환되면 5 분 후에 앱이 로그 아웃됨을 사용자에게 경고해야합니다. 이 알림 후 사용자가 앱을 열면 암호를 묻습니다. 사용자가 올바른 패스를 입력하면 5 분 전에 떠난 화면을 가져와야합니다. 내 문제는 내가 암호를 입력 한 후 검색하기 위해 사용자가 남긴 활동을 저장할 수 없다는 것입니다. 여기까지 내가 한 일은 다음과 같습니다. onSaveInstanceState() 메서드 내부에 카운트 다운을 추가하고 현재 인 텐트의 인스턴스를 만듭니다. 그런 다음 TimeOutActivity에서 해당 인스턴스의 현재 활동을 전달하기 위해 savedActivity라는 속성을 정의했습니다. 시간 초과 경고 알림 후 활동 검색

private boolean isTimedOut; 
private TimeOutActivity timOutActivity; 
private CountDownTimer timer; 

@Override 
protected void onSaveInstanceState(Bundle state) 
{ 
    super.onSaveInstanceState(state); 
    if (timOutActivity == null) 
    { 
     timOutActivity = new TimeOutActivity(); 
     timOutActivity.setIntent(new Intent(getApplicationContext(), TimeOutActivity.class)); 
     **timOutActivity.savedActivity = this;** 
     initializeTimer(); 
    } 
} 
private void initializeTimer() 
{ 
    timer = new CountDownTimer(60000, 1000) 
    {   
     public void onTick(long millisUntilFinished) 
     { 
      if (millisUntilFinished/1000 == 55) 
      { 
       showSignOutWarning(); 
       isTimedOut = true; 
      } 
     } 

     public void onFinish() 
     { 
      // Push local notification 
      isSignedOut = true; 
     } 
    }.start(); 
} 

그런 다음 ONSTART() 메소드에서 나는 다음과 같은 코드를 추가 :

@Override 
public void onStart() 
{ 
    super.onStart(); 
    if (isTimedOut) 
    { 
     // Load timedOut activity 
     startActivity(timOutActivity.getIntent()); 
     isTimedOut = false; 
    } 
} 

을하지만 TimeOutActivity의 내부 활동을 검색 할 때, 내 재산 (savedActivity)은 null입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 현재 활동을 저장하는 더 좋은 방법이 있습니까?

업데이트 10 월 31 일 2014 응용 프로그램을 확장하는 App.java 클래스를 정의했습니다. 이 클래스에서는 setter와 getter로 전역 변수를 정의 할 수 있습니다.

((App) this.getApplication()).setWebView(webView); 
: 그것은 응용 프로그램 태그에 내 WebViewActivity 이동 중지() 메소드에 다음이

android:name="your.app.bundle.name.App" 

추가의 AndroidManifest.xml에 다음 울부 짖는 소리

public class NGVApp extends Application 
{ 
    private WebView webView; 

    public WebView getWebView() 
    { 
     return webView; 
    } 

    public void setWebView(WebView webView) 
    { 
     this.webView = webView; 
    } 
} 

처럼, 나는 웹보기 예를 울부 짖는 소리처럼 설정

마지막으로 onCreate() 메소드에 다음을 추가했습니다.

@Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     if(((NGVApp) this.getApplication()).getSavedInstanceBundle() != null) 
     { 
      savedInstanceState = ((NGVApp) this.getApplication()).getSavedInstanceBundle(); 
     } 
} 

webView의 인스턴스를 성공적으로 가져올 수 있었지만 더 이상 null이 아니지만 webView 내용 (사용자가 시간 초과 전에 상호 작용 한 내용)이 포함되어 있지 않습니다.

+0

앱이 백그라운드에서 종료되면 저장된 인스턴스도 null이됩니다. 이것을하기 위해'SharedPreferences'를 사용하고 마지막 활동 이름을 저장하고 거기에서 검색하는 것이 더 낫습니다. –

+0

감사합니다. @BharathMg 방금 활동 이름을 저장하면 전체 활동을 검색 할 수 있습니까? 더 설명해 주시겠습니까? – Hamid

+0

'Intent intent = new Intent(). setClassName (context, targetClassString);'을 사용하여 문자열 클래스 이름을 인 텐트로 변환 할 수 있습니다. –

답변

1

마지막으로 나는 해결책을 찾아 냈습니다. WebView의 상태를 저장하고 모든 컨텐츠를 보유 할 수있는 방법이 없으므로 WebView를 다시로드하거나 다시 만들지 않아야합니다. 응용 프로그램을 통해 당신은 웹보기를 새로 고치려면 전체 인스턴스를 다시 필요한 경우

<activity ... 
     android:launchMode="singleInstance" 
     android:alwaysRetainTaskState="true"> 

그런 다음 사용할 수 있습니다 : 웹보기는 우리가 우리의 매니페스트 파일에 다음 코드를 추가해야합니다 포함 우리의 활동의 하나 개의 인스턴스를하기 위해 끝(); 그것이 활동의 ​​내부에 있거나 다른 활동에 있고 WebView 활동을 다시 만들고 싶다면 this link을 읽어보십시오.

0

먼저 AlarmManager를 사용하여 서비스에서 알림을 트리거해야합니다.

Intent intent = new Intent(context, YourNotifService.class); 
PendingIntent pendingService = PendingIntent.getService(context, 0, intent, 0); 
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
long triggerTime = SystemClock.elapsedRealtime() + (5 * 60 * 1000); 
alarm.set(AlarmManager.ELAPSED_REALTIME, triggerTime, pendingService); 

활동의 전체 상태 저장에 대해서는 각보기를 거쳐 상태를 저장해야합니다. 가장 좋은 방법은 SharedPreferences가 아닌 특정 파일에 저장하는 것이지만 둘 다 작동 할 수 있습니다.