【问题标题】:Android Force Update Webview SessionAndroid 强制更新 Webview 会话
【发布时间】:2017-04-06 04:14:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: java android session webview session-cookies


    【解决方案1】:

    工作示例:

      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;
        }
    }
    

    比如闪屏,app的一屏

    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();
    

    【讨论】:

    • 我认为这无关紧要。也许我没有说清楚,除了主要活动(使用 webview)我没有其他活动,所有的登录和会话处理都是由网站完成的,应用程序不处理任何这些,它不是为了。会话数据已经由 webview 存储,我只需要知道如何自己强制保存。
    • 我相信这可以帮助你stackoverflow.com/questions/2566485/…
    【解决方案2】:

    我最终在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 在棒棒糖中已过时,请改为在 CookieManager 实例上调用 flush。这会将内存中的 cookie 保存到永久存储中。请注意,这仍然是异步完成的,因此您无法运行它onDestroy() 它仍然需要几秒钟。

    我已将它放在@JavascriptInterface 函数中,每当用户登录或注销时,javascript 都会调用该函数,并且它似乎运行良好。

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 2013-01-30
      • 1970-01-01
      • 2017-05-24
      • 2014-02-01
      • 1970-01-01
      • 2012-09-29
      • 2015-10-17
      • 1970-01-01
      相关资源
      最近更新 更多