0

我将 Google Cloud Messaging (GCM) 的发件人 ID 存储在资产文件夹中的属性文件中。我想在调用GCMIntentService父构造函数(GCMBaseIntentService的构造函数)之前获取发件人 ID。我目前的解决方案是:

在我的默认活动中,名为InitActivity

public class InitActivity extends Activity {
  public static Context appContext;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        appContext = getApplicationContext();
        // ...

在我的GCMIntentService

public GCMIntentService() {
        super(GCMIntentService.getSenderID());
        Log.d(TAG, "GCMIntentService SenderID : " + GCMIntentService.getSenderID());
    }

private static String getSenderID() {
    Resources resources = InitActivity.appContext.getResources();
    AssetManager assetManager = resources.getAssets();

    try {
        InputStream inputStream = assetManager.open("config.properties");
        Properties properties = new Properties();
        properties.load(inputStream);
        return properties.getProperty("SENDER_ID");
    } catch (IOException e) {
        System.err.println("Failed to open property file");
        e.printStackTrace();
        return null;
    }
}

我的问题是:

  1. 以静态方式保存 Context 是否可以(它会消耗大量内存,还是会导致内存泄漏)?参考问题

  2. 有没有更好的方法从属性文件中获取发件人 ID?

  3. 将代码放在 Activity 中是明智的选择吗?

4

1 回答 1

2
  1. 我建议您不要在某处保存上下文,除非您绝对确定不会在某处保存对它的引用。您最终可能会泄漏 context存在很大的风险。

  2. 从属性文件加载发件人 ID 是一种方法,而且您似乎以正确的方式进行操作。你也可以把它放在 res/values/gcm.xml 的配置文件中:

    你的发件人

并像任何其他字符串一样检索它:

String senderid = context.getString(R.string.gcm_senderid);
  1. 是的,我想是的,但你真的需要那样存储上下文吗?让我建议你试试这个:

    公共 GCMIntentService() { super(); }

    @Override protected String[] getSenderIds(Context context) { AssetManager assetManager = context.getResources().getAssets();

    String senderId = null;
    try {
        InputStream inputStream = assetManager.open("config.properties");
        Properties properties = new Properties();
        properties.load(inputStream);
        senderId = properties.getProperty("SENDER_ID");
    }
    catch (IOException e) {
        System.err.println("Failed to open property file");
        e.printStackTrace();
    }
    return new String[] { senderId };
    

    }

这使用无参数构造函数getSenderIds()方法来提供特定于上下文的发送者 ID。

于 2013-06-06T11:20:06.037 回答