我将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;
}
}
我的问题是:
以静态方式保存Context是否可行(它会消耗大量内存,还是会导致内存泄漏)?参考question。
有没有更好的方法从属性文件中获取发件人ID?
将代码置于Activity中是明智的选择吗?
答案 0 :(得分:2)
我建议您不要在某处保存上下文,除非您完全确定不在某处保存对它的引用。您最终可能会遇到leaking a context。
从属性文件加载发件人ID是一种方法,您似乎以正确的方式执行此操作。您也可以将它放在res / values / gcm.xml中的配置文件中:
yoursenderid
并像任何其他字符串一样检索它:
String senderid = context.getString(R.string.gcm_senderid);
是的,我想是的,但你真的需要以这种方式存储一个上下文吗?我建议你试试这个:
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 };
}
这使用no argument constructor和getSenderIds()方法提供特定于上下文的发件人ID。