Android Force更新Webview会话

时间:2016-11-22 13:06:55

标签: java android session webview session-cookies

我有一个嵌入了Webview的Android应用程序和该应用程序连接的网站。登录(或注销)给用户时,会话数据似乎需要大约一两分钟才能存储到永久存储器中。

这样做的结果是,如果在登录(或注销)后立即关闭应用程序,则会话数据不会持续存在,并且稍后再次打开应用程序将恢复到上一个​​会话。

这看起来像某种缓存问题,我已经四处寻找解决方案,但我似乎无法找到任何强制更新会话数据的方法,如果有人,我将不胜感激可以指出我正确的方向。

2 个答案:

答案 0 :(得分:0)

工作示例:

  public class SessionManager {

    public void setPreferences(Context context, String key, String value) {

        SharedPreferences.Editor editor = context.getSharedPreferences("Androidwarriors", Context.MODE_PRIVATE).edit();
        editor.putString(key, value);
        editor.commit();

    }


    public String getPreferences(Context context, String key) {

        SharedPreferences prefs = context.getSharedPreferences("Androidwarriors", Context.MODE_PRIVATE);
        String position = prefs.getString(key, "");
        return position;
    }
}

例如,启动画面,应用程序的一个屏幕

public class Splash extends AppCompatActivity {
SessionManager manager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    manager=new SessionManager();

    // METHOD 1

    /****** Create Thread that will sleep for 3 seconds *************/
    Thread background = new Thread() {
        public void run() {

            try {
                // Thread will sleep for 3 seconds
                sleep(3*1000);

                // After 5 seconds redirect to another intent
                String status=manager.getPreferences(Splash.this,"status");
                Log.d("status",status);
                if (status.equals("1")){
                    Intent i=new Intent(Splash.this,MainActivity.class);
                    startActivity(i);
                }else{
                    Intent i=new Intent(Splash.this,LoginActivity.class);
                    startActivity(i);
                }


                //Remove activity
                finish();

            } catch (Exception e) {

            }
        }
    };

    // start thread
    background.start();


}

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//***Change Here***
    startActivity(intent);
    finish();
    System.exit(0);
}
}

添加到登录活动

 manager.setPreferences(LoginActivity.this, "status", "1");
    String status=manager.getPreferences(LoginActivity.this,"status");
    Log.d("status", status);
    // Toast.makeText(getBaseContext(), "Bem-Vindo", Toast.LENGTH_LONG).show();
     Intent i = new Intent(LoginActivity.this, Web.class);
    startActivity(i);
webview类

上的

public class Web extends AppCompatActivity {
//private WebView webView;

SessionManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_web_view);

    manager = new SessionManager();



   // webView = (WebView) findViewById(R.id.webView);
    WebView webView = new WebView(this);
    final WebSettings settings = webView.getSettings();
    webView.getSettings().setJavaScriptEnabled(true);
    settings.setJavaScriptEnabled(true);
    settings.setAppCacheEnabled(false);
    settings.setPluginState(WebSettings.PluginState.ON);
    setContentView(webView);
    webView.setWebViewClient(new WebViewClient());
    webView.loadUrl("link");

}




@Override
public void onBackPressed() {
    super.onBackPressed();

    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//***Change Here***
    startActivity(intent);
    finish();
    System.exit(0);
}

}

要关闭会话,请使用此

  manager.setPreferences(Web.this, "status", "0");
            finish();

答案 1 :(得分:0)

我最终在JavascriptInterface

中使用了以下代码
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        //Not sure if this part works haven't tested it yet
        CookieSyncManager sm = CookieSyncManager.createInstance(context);
        sm.sync();
    } else {
        cookies.flush();
    }

CookieSyncManager在棒棒糖中已过时,请在flush实例上调用CookieManager。这样可以将内存中的cookie保存到永久存储中。请注意,这仍然是异步完成的,因此您无法运行它onDestroy()它仍然需要几秒钟。

我把它放在@JavascriptInterface函数中,当用户登录或注销时,javascript会调用它,它似乎运行得很好。