GCM:在调用GCMIntentService父构造函数之前从属性文件中获取发件人ID

时间:2013-06-06 10:27:55

标签: android google-cloud-messaging

我将Google Cloud Messaging(GCM)的发件人ID存储在asset文件夹中存储的属性文件中。我想在调用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是否可行(它会消耗大量内存,还是会导致内存泄漏)?参考question

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

  3. 将代码置于Activity中是明智的选择吗?

1 个答案:

答案 0 :(得分:2)

  1. 我建议您不要在某处保存上下文,除非您完全确定不在某处保存对它的引用。您最终可能会遇到leaking a context

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

    yoursenderid

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

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

      public GCMIntentService(){     超(); }

      @覆盖 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 };
      

      }

    2. 这使用no argument constructorgetSenderIds()方法提供特定于上下文的发件人ID。