我尝试了解Android同步逻辑.我不明白的是syncadapter.xmlAndroid SDK示例项目中包含的文件SampleSyncAdapter.如果您下载了SDK示例,则它应位于以下文件夹中:
SDK/android-sdk-PLATFORM/samples/android-VERSION/SampleSyncAdapter/res/xml/syncadapter.xml
Run Code Online (Sandbox Code Playgroud)
我读过,内容提供者的权限应该是字符串或对资源的引用.内容权限到底是什么com.android.contacts?以下是文件的内容(没有许可证信息和注释,API级别16).
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="com.android.contacts"
android:accountType="com.example.android.samplesync"
android:supportsUploading="false"
android:userVisible="true"
/>
Run Code Online (Sandbox Code Playgroud) 我正在编写自己的ContentProvider,它将使用SyncAdapter同步到Web服务.
当同步适配器正在修改内容提供程序的数据时,问题发生在内部调用getContentResolver().notifyChange导致同步循环时,提供程序触发网络同步.
客户端应用程序执行修改时需要带有网络同步标志的notifyChange,但在同步适配器修改时应避免使用.
如何在内容提供者内部轻松判断客户端应用程序(应该在修改时触发网络同步)或同步适配器(不应触发网络同步)使用它.
目前我正在使用不同的CONTENT_URI(同步适配器使用CONTENT_URI_NO_SYNC访问数据,使用CONTENT_URI访问客户端应用程序)以便能够区分这两种类型的访问并相应地设置网络同步标志.
背景: 我有一个复杂的类,有很多变量.我有一个声音和测试的复制构造函数:
Applepie::Applepie( const Applepie ©) :
m_crust(copy.m_crust),
m_filling(copy.m_filling)
{
}
Run Code Online (Sandbox Code Playgroud)
在初始化列表中调用的一些成员变量复制构造函数执行分配.
问题:
我需要创建operator=.我可以简单地执行以下操作,而不是使用赋值而不是初始化列表复制现有的构造函数,释放正在被替换的内存等等,
Applepie& Applepie::operator=( const Applepie ©)
{
if( this != ©)
{
this->~Applepie(); // release own object
new(this) Applepie(copy); // placement new copy constructor
}
return *this;
}
Run Code Online (Sandbox Code Playgroud)
换句话说,是毁灭自我后跟一个放置新的复制构造函数在语义上与operator =?
这似乎有可能大大减少重复代码并确认每个变量都已正确初始化,但代价是在分配期间可能会略微降低效率.我错过了一些更加模糊的东西吗?
理由: 我的实际班级有大约30个变量.我担心我的复制构造函数和我的赋值操作符都必须复制所有三十个,并且代码可能会发散,导致两个操作以不同的方式执行操作.
我在我的应用程序中集成了android的帐户管理,我可以从Accounts & Sync设置中管理帐户.
我希望有一个经典的登录活动,可以在成功登录时将用户转发到他的家庭活动,并可以选择记住用户的密码.但是,AccountAuthenticatorActivity必须将其结果返回到AccountManager凭据和其余帐户信息,调用显式finish()并返回意图.
如何在AccountManager不进行finish()登录活动的情况下提供所需的信息?
使用时AsyncTaskLoader屏幕方向发生变化,我遇到了一些麻烦.让我给你一些关于我的应用程序结构的背景:我有一个非常简单的应用程序,它从一个URL获取结果并显示它.该应用程序由一个FragmentActivity和三个组成Fragments.我的三个片段如下:
将AsyncTaskLoader被用于从任一个内容提供者加载数据(如果它是高速缓存),或从网络上.
一切都很好,直到屏幕上的变化!我查看了输出,LoaderManager.enableDebugLogging(true) 似乎问题的根源是LoaderCallbacks.onLoadFinished在我的活动中没有被调用.
这是启动加载器的一段代码:
/* This function is defined in the "first" fragment in an interface and
* implemented in the activity */
@Override
public void onFormSubmission(String word) {
showLoadingFragment();
if ( mWord == null || mWord.equals(word) ) {
getSupportLoaderManager().initLoader(0, word, this);
} else {
getSupportLoaderManager().restartLoader(0, word, this);
}
// Store the word
mWord = word;
}
Run Code Online (Sandbox Code Playgroud)
显示结果的代码:
@Override
public void onLoadFinished(Loader<Bundle> loader, Bundle data) …Run Code Online (Sandbox Code Playgroud) 这是一个很神奇的问题.我理解对ContentResolver方法的调用需要一个特定于ContentProvider的URI,但android如何实际建立关联?
我猜测任何与AndroidManifest.xml中的ContentProvider提供的权限相匹配的URI都会涉及到.请求是否发送到包含该权限的每个提供商?如果我尝试创建其权限前缀为另一个权限的提供程序将是一个问题?
有没有办法看看ContentProvider是否正在运行?我想也许getType()方法的虚拟响应可能表示活跃.