在Android的活动,服务和应用程序之间传递变量(Passing variables betwee

2019-07-29 18:38发布

会有人请我提供以下活动/服务/应用程序组合的例子。 我有三个,但我已经把我的应用程序搞得一塌糊涂试图通过一堆左右的地方变量,现在我不知道发生了什么事情。 请注意,我是新来的机器人,我最近与此挣扎,因为有这么多的方面,这可以实现。

我只是想看看3类活动,服务和应用的地方会发生以下情况:

  • 活动存储在应用程序变量x,启动服务,并且开始活动2。

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

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

需要注意的是变量x可能是从一个Int什么一个ArrayList,并在我的实际的程序,有很多的变量(因此对于一个应用程序类的愿望)。

我会很感激这个具体的例子的一个很好的例子,因为我一直在试图弄清楚这一切了一会儿。 如果有人请花时间放在一起了坚实的答案,我将不胜感激。

对于任何人问为什么,整个事情是一个音乐播放器。 所述用户选择一个乐曲,艺术家/唱片集等是(希望)存储在应用程序。 然后,该服务已启动,控制歌曲播放,让来自应用程序的songpath。 第二个活动显示与歌曲信息(也从应用程序)的UI和有一个/上一个按钮,这将改变一些应用程序中的变量的值,并指示服务检索新值。 如果用户导航离开,变量会一直存在于应用程序,因此,如果创建了另一个用户界面,歌曲信息,可以很容易地设置。

我在用正确的方法?

我可以提供我的本钱的例子,但它当时是一个烂摊子。 总之,只是说,如果你认为它会帮助你帮我下面的要求。

Answer 1:

你并不需要扩展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;
}


Answer 2:

我只是用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);
    }


Answer 3:

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

可以把在WeakReferences的一个HashMap到对象的应用程序文件,并在其中设置的值...

现在你可以从活动以及从服务访问应用程序使用....((YOUR_APPLICATION_NFILE_NAME)this.getApplication())。 的getter / setter;



Answer 4:

使用下面摘录:

应用类:

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

存储和检索的活动值:

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. 创建应用程序的类名变量 - >私人ManagerName的CacheManager;
  2. 初始化它作为 - >的CacheManager = ManagerName.getInstance(ActivityName.this);
  3. 使用这个实例来保存和获取值:

cacheManager.setMerchant( “你好”);

cacheManager.getMerchant();

更多参考检查此链接应用程序类。



文章来源: Passing variables between activities, services & applications in android