【问题标题】:How to create a singleton object for a whole application in Android如何在 Android 中为整个应用程序创建单例对象
【发布时间】:2013-01-18 19:30:41
【问题描述】:

我正在编写代码以使用单例对象创建应用程序。 什么时候上线,

  1. 问题出在我启动应用程序时。它将创建一个对象,当我按下后退按钮时,应用程序将关闭。当我长按主页按钮并再次启动应用程序时,它将创建另一个对象。

  2. 当我再次通过单击图标启动应用程序时,它将生成另一个对象。

但是当我通过按主页按钮从应用程序中退出并再次通过长按主页按钮并启动应用程序进入应用程序时,它不会创建新对象。

活动代码:

package com.gmmusic.test;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class GmmusicActivity extends Activity
{
    /** Called when the activity is first created. */
    private static String TAG = "GmmusicActivity";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.i(TAG, "Created instance#"+ MyMainApplication.getInstance().count());
    }
}

单例代码:

package com.gmmusic.test;

import android.app.Application;
import android.util.Log;

public class MyMainApplication extends Application {

    private static String TAG = "MyMainApplication";

    private static MyMainApplication singleton;

    public static MyMainApplication getInstance() {
        return singleton;
    }

    private int count = 0;
    private int count1=0;
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();

        singleton = this;
        Log.i(TAG, "Singleton created");
        System.out.println("count1 >> "+count1);
        count1++;
    }

    public int count() {
        return count++;
    }
}

【问题讨论】:

  • 您的问题到底是什么?当应用程序不再在内存中时,将创建一个新对象,但是当它仍在内存中时,将重用现有的对象。
  • 您想保存应用程序上下文并在每次应用程序启动后加载它,对吗?我认为以这种方式保存应用程序实例是不可能的。你根本不需要使用单例。使用 SharedPreferences 保存您的应用程序数据并在每次应用程序启动后加载它。
  • 亨利:当应用程序。关闭所有对象不应该被杀死,当再次启动应用程序时。它不会创建新对象,直到我不会按 2 次后退按钮。
  • Skywall:我正在制作一个媒体播放器。当我关闭应用程序时。通过单击后退按钮,它会出来,当我再次启动时,它将创建不会发生的新对象。我该如何解决这个问题。

标签: android android-layout android-intent android-widget


【解决方案1】:

您可以创建一个实现 Serializeable 的类:

class Person implements Serializeable
    String name;
    public Person(String name){
        this.name = name;
    }
}

如果你有其他意图,你可以传递它,如果你关闭这个活动,你可以像这样得到结果

Person p = new Person("Oliver");
Intent i = new Intent()
i.setClass(this, NextActivity.class);
i.putExtra("person", p);
startActivityForResult(i,1) // 1 is ResultCode

然后在另一个Activity中,就可以得到这个对象,例如在onCreate中:

protected void onCreate(Bundle savedInstanceState) {
     Log.d(TAG, "onCreate");
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_next);
     Person p = (Person) getIntent().getSerializableExtra("person");
     // The same string as in first_activity
}

在这一切之后,你可以对同一个对象做任何你想做的事情,如果你想回到第一个活动,请阅读Getting a Result from an Activity

【讨论】:

    【解决方案2】:

    处理此行为的最佳方法是通过将活动的午餐模式属性自定义为清单文件。 根据您的应用程序,您可能会将其设置为 SingleTop 或 SingleInstance。 查看文档:Doc

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      相关资源
      最近更新 更多