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 です。私は何を間違っていますか?現在のアクティビティを保存するより良い方法はありますか?

2014 年 10 月 31 日更新 Application を拡張する App.java というクラスを定義しました。このクラスにより、setter と getter を使用してグローバル変数を定義できます。以下のようなものです

public class NGVApp extends Application
{
    private WebView webView;

    public WebView getWebView()
    {
        return webView;
    }

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

次に、Application タグの AndroidManifest.xml にこれを追加しました

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

次に、WebViewActivity onStop() メソッドで、次のように webView インスタンスを設定します。

((App) this.getApplication()).setWebView(webView); 

そして最後に onCreate() メソッドに追加しました:

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

webView のインスタンスを正常に取得できましたが、null ではなくなりましたが、webView のコンテンツ (タイムアウト前にユーザーが操作したもの) が含まれていません。

4

2 に答える 2

1

最後に、解決策を見つけました。WebView の状態を保存してすべてのコンテンツを取得する方法はないため、webView の再読み込みまたは再作成を防止する必要があります。webView を含むアクティビティの 1 つのインスタンスを作成するには、次のコードをマニフェスト ファイルに追加する必要があります。

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

次に、アプリケーションを介してインスタンスを完全に再作成して webView を更新する必要がある場合は、finish(); を使用できます。アクティビティ内にある場合、または別のアクティビティにいて、webView アクティビティを再作成したい場合は、このリンクを読んで実行してください。

于 2015-01-29T17:05:26.997 に答える