如何防止android破坏我的应用程序?

时间:2013-08-16 20:52:51

标签: android

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

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

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

我的问题是,它可以在会话激活时将我的应用程序保存在内存中吗?

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

感谢。

5 个答案:

答案 0 :(得分:1)

不,无法保证您的应用程序会留在内存中。这是设计的。

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

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

使用保存状态可以避免在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为空且文件存在时读取。

答案 1 :(得分:0)

当需要回收资源时,您无法阻止Android销毁您的应用程序。

  

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

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

答案 2 :(得分:0)

Android生态系统有一个规则,即每个应用程序在某些情况下会死亡,而其中一个在后台运行而另一个应用程序在前台运行。

但是,如果应用程序使用前台服务继续工作,你可能会被杀的可能性大大降低。

here's关于android的进程的更多信息。

使用前台服务的缺点是用户不理解你的应用程序需要它的原因,因为他所做的是关闭应用程序,现在他看到应用程序的通知,所以你应该想到一个好的原谅为什么它需要继续运行。

您还可以避免在按下后退按钮时直接关闭应用,在调用moveTaskToBack时调用onBackPressed。它不强制不杀死你的应用程序,但可能需要更长的时间来杀死它。

我认为最好的办法是通过在登录完成后保存数据来处理应用程序的恢复,但这取决于您的需求。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您不必添加任何额外的代码来实现这一点

  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>

如果你想更详细地了解,我自己已经在其中一篇文章中回答了

Prevent activity from being destroyed as long as possible

我希望这会有所帮助