解决方法
我正在为清单中的两个版本定义一个不同的权限,如下所示:
<provider android:name="MyApp.MyProvider" android:authorities="MyApp.MyProvider.free" android:grantUriPermissions="true"/>
然后我在xml文件中配置提供程序(我使用一个特殊的config.xml文件,因为我有更多的配置数据,如提供程序权限,但你当然可以使用strings.xml):
<string name="my_provider_authority">MyApp.MyProvider.free</string>
该代码以任何其他字符串资源的形式检索提供者权限.要在没有上下文的情况下访问字符串资源,请使用应我正在使用应用程序类从我的应用程序中的任何位置访问应用程序上下文(但有两个例外):
public class MyApplication extends Application { private static Context sContext; @Override public void onCreate() { super.onCreate(); sContext = this; } public static Context getContext() { return sContext; } }
当然,您需要在清单中定义MyApplication.
这允许您从应用程序的任何位置访问字符串和其他资源.
但有两个例外:
> ContentProviders. ContentProviders可以在Application启动之前启动,因此您将无法使用Application上下文.这不是问题,因为ContentProviders通过getContext()获得自己的上下文.>静态代码:在Android组件(活动,片段,BroadcastReceivers,服务等)的生命周期之外,上下文可能不可用.因此,依赖于应用程序上下文的静态初始化程序并不是一个好主意.但这也不是一个真正的问题,因为无论如何都不允许在Android组件的生命周期之外使用上下文,并且始终会在该生命周期内调用访问上下文的静态方法.例如.如果一个Activity需要知道一个ContentProvider的权限,它将在你的契约类中调用一个静态方法,并且该调用将来自onCreate()或onStart()等活动的onXYZ()方法之一,这将确保上下文被初始化.所以你需要做的就是延迟初始化你的契约类中的变量,并确保调用者只有在清楚之前已经调用过Application.onCreate()时才会检索变量.当然,从活动中您可以直接检索字符串资源.当您需要其他类/对象中的资源时,我的方法的真正优势将变得明显.这些对象仍然与某些Android组件的生命周期相关联,但您不必将上下文传递给所有这些对象,这是非常麻烦的,2)在泄漏上下文时非常容易出错.可能会导致内存使用问题(Android应用程序最常见的问题之一).