3

我正在编写一个与网站建立会话的应用程序(在请求中维护 cookie)。会话上下文(一个控制所有请求的对象)实际上存储在应用程序类的一个成员中(我需要所有活动和服务都可以访问这个对象来检索数据)。

但现在,我的问题是下一个:

当我退出应用程序(最小化或按下后退按钮)时,我的应用程序死了,我的意思是,进程退出并且应用程序被破坏......所以,当再次启动应用程序时,需要再次登录...... .

我的问题是,它可以在会话处于活动状态时将我的应用程序保留在内存中吗?

我认为,将会话 cookie 存储在 SharedPreferences 中并不是一个好主意,因为我想要一个来自 android 的独立会话上下文实现。

谢谢。

4

5 回答 5

1

不,不能保证您的应用程序将保留在内存中。这是设计使然。

Android 操作系统会自动从内存中删除应用程序,因为它需要更多资源。

您最好的选择:将 cookie 信息保存在 Apps 数据文件夹中的文件中,并在 App 启动时读取。

使用保存状态将避免在 Android 关闭您的应用程序(缺乏资源、不活动)时丢失数据。

public class MyActivity extends Activity {
    public String cookieString;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Set Layout
        setContentView(R.layout.main);

        if(savedInstanceState!=null) {
            // App has been closed by the OS before and is now being restored

            // read your data here from the bundle
            String cookieData =  savedInstanceState.getString("CookieData");
            if(!TextUtils.isEmpty(cookieData)) {
                cookieString = cookieData;
            }
        } else {
            // App is newly started or has been closed by user (i.e. via finish())

            // Your code to read the cookie saved in a text file. 
        }
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        String cookieData =  savedInstanceState.getString("CookieData");
        if(!TextUtils.isEmpty(cookieData)) {
            cookieString = cookieData;
        }
        super.onRestoreInstanceState(savedInstanceState);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // Save the critical data
        outState.putString("CookieData", cookieString);
        super.onSaveInstanceState(outState);
    }
}

它将允许您在应用程序暂停或最小化时保存 cookie 数据,并在应用程序恢复时恢复它。此外,当用户登录时,您也应该将 cookie 数据写入文件,Bundle并在文件为空且文件存在时读取。

于 2013-08-16T20:58:35.833 回答
1

您不必添加任何额外的代码来实现这一点,只需提及

  android:persistent="true"

在您的清单中,这应该可以完成工作。下面是我测试的示例应用程序清单

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat"
        android:persistent="true"
        tools:ignore="AllowBackup,GoogleAppIndexingWarning">
        <activity
            android:name="com.yours.yoursonly.youractivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        </application>

如果您想了解更多详细信息,我本人已在其中一个帖子中进行了回答

尽可能长时间地防止活动被破坏

我希望这有帮助

于 2016-03-04T07:08:45.863 回答
0

the android eco system has a rule that each app will die in certain cases, while one of them is running in the background while another app run on the foreground.

however, you could have a much lower chance of being killed if the app would continue its work using a foreground service.

here's some more information about processes on android.

the downside of using a foreground service is that the user would not understand why your app needs it, since what he did is to close the app, and now he sees a notification of the app, so you should think of a good excuse why it needs to keep running .

you can also avoid directly closing the app upon pressing on the back button, by calling moveTaskToBack when onBackPressed is called. it doesn't force not killing your app, but might take a little longer to kill it.

i think the best thing is to handle restoration of your app, by saving data after login has finished, but it depends on your needs.

于 2013-08-16T22:15:09.107 回答
0

您无法阻止 Android 在需要回收资源时破坏您的应用程序。

在某些情况下,您的 Activity 由于正常的应用程序行为而被破坏,例如当用户按下后退按钮或您的 Activity 通过调用 finish() 发出自己的破坏信号时。如果您的活动当前已停止并且长时间未使用,或者前台活动需要更多资源,系统也可能会破坏您的活动,因此系统必须关闭后台进程以恢复内存。

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

于 2013-08-16T20:57:40.760 回答
0

请检查“设置”->“开发者选项”->右侧面板中是否未选中“不保留活动”选项,您可以找到名为:“不保留活动”的复选框

于 2014-06-23T06:44:35.940 回答