2

有人可以为我提供以下活动/服务/应用程序组合的示例。我有这三个,但我已经把我的应用程序变成了一个混乱的地方,试图在这个地方传递一堆变量,现在我不知道发生了什么。请注意,我是 android 新手,我最近一直在努力解决这个问题,因为有很多方法可以实现它。

我只想看看发生以下情况的 3 类活动、服务和应用程序:

  • Activity 将变量 x 存储在 Application 中,启动 Service,并启动 Activity 2。

  • 服务从应用程序中检索变量 x。

  • 活动 2 从应用程序中检索变量 x。

请注意,变量 x 可以是从 Int 到 ArrayList 的任何内容,并且在我的实际程序中,有很多变量(因此需要应用程序类)。

我真的很感激这个具体例子的一个很好的例子,因为我一直试图弄清楚这一切。如果有人愿意花时间整理一个可靠的答案,我将不胜感激。

对于任何问为什么的人,整个事情都是一个音乐播放器。用户选择一首歌曲,并且艺术家/专辑等(希望)存储在应用程序中。然后启动服务,控制歌曲播放,从应用程序获取歌曲路径。第二个活动显示带有歌曲信息(也来自应用程序)的 UI,并具有下一个/上一个按钮,这将更改应用程序中某些变量的值,并指示服务检索新值。如果用户导航离开,变量将始终存在于应用程序中,因此如果创建另一个 UI,则可以轻松设置歌曲信息。

我是否使用了正确的方法?

我可以提供一个我所拥有的例子,但目前它是一团糟。无论如何,如果您认为它会帮助您帮助我,请在下面提出要求。

4

4 回答 4

4

你不需要为此扩展Application。您可以在某个类中使用静态成员变量,如下所示:

public class Globals {
    public static String myVariable;
}

public class Activity1 extends Activity implements View.OnClickListener {
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ...
    }

    public void onClick(View view) {
        // Save song name and stuff
        Globals.myVariable = "SongNameAndStuff"; // Save in static global variable
        startService(); // with appropriate parameters
        startActivity(); // with appropriate parameters

    }
}

public class Activity2 extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // Get song name from Globals
       String mySongName = Globals.myVariable;
        ...
    }

public class MyService extends Service {
    // Access to song name from whatever method needs it:
    String mySongName = Globals.myVariable;
}
于 2012-06-06T07:30:52.693 回答
0

我只是使用 sharedpreferences tbh。听起来像您需要的...使类静态可访问,然后使静态 getter 和 setter 方法。

    import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;

public class OurPreferences {
    private static final String TAG = OurPreferences.class.getSimpleName();
    private final String PREFERENCES = "MobilityPreferences";
    private Context mContext;



private OurPreferences() {
}

private static SharedPreferences getPrefs(Context ctx) {
    return ctx.getSharedPreferences("PREFERENCES", Context.MODE_PRIVATE);
}
public static void setRegistrationId(String registrationId,
        long timeChanged, Context ctx) {
    if (registrationId != null) {
        Editor editor = getPrefs(ctx).edit();
        editor.putString("registrationId", registrationId);
        editor.putLong("timeChanged", timeChanged);
        editor.commit();
    }
}

public static boolean isRegistered(Context ctx) {
    boolean registered = getPrefs(ctx).getString("registrationId", null) != null;
    return registered;
}

public static long getRegistrationTimeInMilis(Context ctx){
   return getPrefs(ctx).getLong("timeChanged", -1L);
    }
于 2012-06-06T07:15:07.903 回答
0

http://developer.android.com/resources/faq/framework.html#3

可以在 Application 文件中放置一个 WeakReferences 到 Objects 的 HashMap 并在其中设置值...

现在您可以使用 ((YOUR_APPLICATION_NFILE_NAME)this.getApplication()) 从 Activity 以及从服务中访问应用程序。获取器/设置器;

于 2012-06-06T07:23:54.937 回答
0

使用以下片段:

应用类:

public class ManagerName extends Application {
private static ManagerName singleton;
private String merchant;

public synchronized static ManagerName getInstance(Context context) {
    if (null == singleton) {
        singleton = new ManagerName();
    }
    return singleton;
}

public void setMerchant(String merchant) {
    this.merchant = merchant;
}

public String getMerchant() {
    return merchant;
}
}

在 Activity 中存储和检索值:

public class ActivityName extends Activity  {

private ManagerName cacheManager;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.user_details);

    cacheManager = ManagerName.getInstance(ActivityName.this);

    String merchant = cacheManager.setMerchant("Hello");// Store data in Application Class
    String storedValue=cacheManager.getMerchant();  // Retrieve Value from Application class    
}
}

你的清单应该是这样的:

<application
    android:name=".ManagerName"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity>......</activity>
</application>

从应用程序存储和取回价值的概念非常简单:

  1. 在 Application 类名中创建变量 -> private ManagerName cacheManager ;
  2. 将其初始化为 -> cacheManager = ManagerName.getInstance(ActivityName.this);
  3. 使用此实例保存并获取值:

cacheManager.setMerchant("你好");

缓存管理器.getMerchant();

如需进一步参考,请检查此链接应用程序类。

于 2012-06-06T07:31:47.697 回答