当前位置: 首页 > news >正文

成都做公司网站电脑购物网站模板

成都做公司网站,电脑购物网站模板,温州建网站业务人员,苏州网站开发建设方案装过Android版的Facebook、lastfm的同学是否对于这些应用的功能感到惊喜#xff0c;它们可以定期更新朋友的最新信息#xff0c;将最新近况和心情短语集成入联系人中。这些应用全部是以Android2.0后的账户和同步机制为基础的。Google的例程中给出了名为SampleSyncAdpater的例… 装过Android版的Facebook、lastfm的同学是否对于这些应用的功能感到惊喜它们可以定期更新朋友的最新信息将最新近况和心情短语集成入联系人中。这些应用全部是以Android2.0后的账户和同步机制为基础的。Google的例程中给出了名为SampleSyncAdpater的例子通过分析该例子可以学会Android中的Account验证、同步Adapter的使用。 详细例子代码可以看sdk samples中提供的源码现在拿2.2中的版本来简要说明。 首先是 class Authenticator extends AbstractAccountAuthenticator 该类是账户认证类打开手机的Setting里有AccountSync 一项Authenticator就是实现其中的账号功能的类。 [java]  view plain copy // in Authenticator.java       public Bundle addAccount(AccountAuthenticatorResponse response,           String accountType, String authTokenType, String[] requiredFeatures,           Bundle options) {           final Intent intent  new Intent(mContext, AuthenticatorActivity.class);           intent.putExtra(AuthenticatorActivity.PARAM_AUTHTOKEN_TYPE,               authTokenType);           intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE,               response);           final Bundle bundle  new Bundle();           bundle.putParcelable(AccountManager.KEY_INTENT, intent);           return bundle;       }   其中addAccount方法用来定义需要增加账号时的操作如调用AuthenticatorActivity来进行账号的添加认证。 在AuthenticatorActivity.java中定义了handleLogin()此方法由login_activity.xml中的android:onClickhandleLogin定义与ui中的okbutton的关联。 [java]  view plain copy // in layout/login_activity.xml   Button               android:idid/ok_button               android:layout_widthwrap_content               android:layout_heightwrap_content               android:layout_gravitycenter_horizontal               android:minWidth100dip               android:textstring/login_activity_ok_button               android:onClickhandleLogin /   handleLogin()将ui中的用户名和密码取得并创建一个试图认证的线程通过网络去服务端验证。 NetworkUtilities.java中的 public static boolean authenticate(String username, String password, Handler handler, final Context context)方法展示了通过网络验证的具体流程。得到服务端验证结果后在sendResult()中通过handler.post调用来实现onAuthenticationResult()在AuthenticatorActivity中的运行。onAuthenticationResult()判断验证通过则结束AuthenticatorActivity否则报出用户名密码错让用户在AuthenticatorActivity中再次尝试验证。 [java]  view plain copy // AuthenticatorActivity.java中的handleLogin()方法       /**       * Handles onClick event on the Submit button. Sends username/password to       * the server for authentication.       *        * param view The Submit button for which this method is invoked       */       public void handleLogin(View view) {           if (mRequestNewAccount) {               mUsername  mUsernameEdit.getText().toString();           }           mPassword  mPasswordEdit.getText().toString();           if (TextUtils.isEmpty(mUsername) || TextUtils.isEmpty(mPassword)) {               mMessage.setText(getMessage());           } else {               showProgress();               // Start authenticating...               mAuthThread                    NetworkUtilities.attemptAuth(mUsername, mPassword, mHandler,                       AuthenticatorActivity.this);           }       }   [java]  view plain copy // NetworkUtilities中的authenticate()方法通过网络访问具体来实现服务端的验证sendResult()来使调用结果被AuthenticatorActivity的onAuthenticationResult()调用。       /**       * Connects to the Voiper server, authenticates the provided username and       * password.       *        * param username The users username       * param password The users password       * param handler The hander instance from the calling UI thread.       * param context The context of the calling Activity.       * return boolean The boolean result indicating whether the user was       *         successfully authenticated.       */       public static boolean authenticate(String username, String password,           Handler handler, final Context context) {           final HttpResponse resp;              final ArrayListNameValuePair params  new ArrayListNameValuePair();           params.add(new BasicNameValuePair(PARAM_USERNAME, username));           params.add(new BasicNameValuePair(PARAM_PASSWORD, password));           HttpEntity entity  null;           try {               entity  new UrlEncodedFormEntity(params);           } catch (final UnsupportedEncodingException e) {               // this should never happen.               throw new AssertionError(e);           }           final HttpPost post  new HttpPost(AUTH_URI);           post.addHeader(entity.getContentType());           post.setEntity(entity);           maybeCreateHttpClient();              try {               resp  mHttpClient.execute(post);               if (resp.getStatusLine().getStatusCode()  HttpStatus.SC_OK) {                   if (Log.isLoggable(TAG, Log.VERBOSE)) {                       Log.v(TAG, Successful authentication);                   }                   sendResult(true, handler, context);                   return true;               } else {                   if (Log.isLoggable(TAG, Log.VERBOSE)) {                       Log.v(TAG, Error authenticating  resp.getStatusLine());                   }                   sendResult(false, handler, context);                   return false;               }           } catch (final IOException e) {               if (Log.isLoggable(TAG, Log.VERBOSE)) {                   Log.v(TAG, IOException when getting authtoken, e);               }               sendResult(false, handler, context);               return false;           } finally {               if (Log.isLoggable(TAG, Log.VERBOSE)) {                   Log.v(TAG, getAuthtoken completing);               }           }       }          /**       * Sends the authentication response from server back to the caller main UI       * thread through its handler.       *        * param result The boolean holding authentication result       * param handler The main UI threads handler instance.       * param context The caller Activitys context.       */       private static void sendResult(final Boolean result, final Handler handler,           final Context context) {           if (handler  null || context  null) {               return;           }           handler.post(new Runnable() {               public void run() {                   ((AuthenticatorActivity) context).onAuthenticationResult(result);               }           });       }   [java]  view plain copy // AuthenticatorActivity.java中的onAuthenticationResult来根据验证结果来选择结束认证或重新尝试。       /**       * Called when the authentication process completes (see attemptLogin()).       */       public void onAuthenticationResult(boolean result) {           Log.i(TAG, onAuthenticationResult(  result  ));           // Hide the progress dialog           hideProgress();           if (result) {               if (!mConfirmCredentials) {                   finishLogin();               } else {                   finishConfirmCredentials(true);               }           } else {               Log.e(TAG, onAuthenticationResult: failed to authenticate);               if (mRequestNewAccount) {                   // Please enter a valid username/password.                   mMessage                       .setText(getText(R.string.login_activity_loginfail_text_both));               } else {                   // Please enter a valid password. (Used when the                   // account is already in the database but the password                   // doesnt work.)                   mMessage                       .setText(getText(R.string.login_activity_loginfail_text_pwonly));               }           }       }   Account的验证完毕后就生成了账号可以开始使用同步功能了。同步的主要逻辑在public class SyncAdapter extends AbstractThreadedSyncAdapter中实现。 [java]  view plain copy // SyncAdapter.java中的OnPerformSync方法主要的同步逻辑       Override       public void onPerformSync(Account account, Bundle extras, String authority,           ContentProviderClient provider, SyncResult syncResult) {           ListUser users;           ListStatus statuses;           String authtoken  null;            try {                // use the account manager to request the credentials                authtoken                    mAccountManager.blockingGetAuthToken(account,                       Constants.AUTHTOKEN_TYPE, true /* notifyAuthFailure */);                // fetch updates from the sample service over the cloud                users                    NetworkUtilities.fetchFriendUpdates(account, authtoken,                       mLastUpdated);               // update the last synced date.               mLastUpdated  new Date();               // update platform contacts.               Log.d(TAG, Calling contactManagers sync contacts);               ContactManager.syncContacts(mContext, account.name, users);               // fetch and update status messages for all the synced users.               statuses  NetworkUtilities.fetchFriendStatuses(account, authtoken);               ContactManager.insertStatuses(mContext, account.name, statuses);           } catch (final AuthenticatorException e) {               syncResult.stats.numParseExceptions;               Log.e(TAG, AuthenticatorException, e);           } catch (final OperationCanceledException e) {               Log.e(TAG, OperationCanceledExcetpion, e);           } catch (final IOException e) {               Log.e(TAG, IOException, e);               syncResult.stats.numIoExceptions;           } catch (final AuthenticationException e) {               mAccountManager.invalidateAuthToken(Constants.ACCOUNT_TYPE,                   authtoken);               syncResult.stats.numAuthExceptions;               Log.e(TAG, AuthenticationException, e);           } catch (final ParseException e) {               syncResult.stats.numParseExceptions;               Log.e(TAG, ParseException, e);           } catch (final JSONException e) {               syncResult.stats.numParseExceptions;               Log.e(TAG, JSONException, e);           }       }   onPerformSync中的执行流程中使用NetworkUtilities中的fetchFriendUpdates和fetchFriendStatuses来访问服务端的联系人更新并使用了例程中自己封装的ContactManager来读取、更新联系人信息。 那Account和SyncAdapter及其Service和xml定义之间是如何关联的呢 AndroidManifest.xml中定义了AccountAuthenticatorSyncAdapter及对应的Service和xml定义的关联。 [java]  view plain copy application       android:icondrawable/icon       android:labelstring/label       !-- The authenticator service --       service           android:name.authenticator.AuthenticationService           android:exportedtrue           intent-filter               action                   android:nameandroid.accounts.AccountAuthenticator /           /intent-filter           meta-data               android:nameandroid.accounts.AccountAuthenticator               android:resourcexml/authenticator /       /service       service           android:name.syncadapter.SyncService           android:exportedtrue           intent-filter               action                   android:nameandroid.content.SyncAdapter /           /intent-filter           meta-data               android:nameandroid.content.SyncAdapter               android:resourcexml/syncadapter /           meta-data               android:nameandroid.provider.CONTACTS_STRUCTURE               android:resourcexml/contacts /       /service       activity           android:name.authenticator.AuthenticatorActivity           android:labelstring/ui_activity_title           android:themeandroid:style/Theme.Dialog           android:excludeFromRecentstrue                      !--               No intent-filter here! This activity is only ever launched by               someone who explicitly knows the class name           --       /activity   /application   更详细的代码细节和执行流程可以去把SDK中的SampleSyncAdapter代码运行起来体会一下不过要实现整个流程必须搭建联系人的服务器端例程中在目录samplesyncadapter_server中也提供了简单的server端python代码需要搭建在google app engine上。搭建过程遇到一些问题由于对python不熟我弄了几天才解决好搭建成功其中遇到的一个model moudle找不到的问题需要你在model中新建一个__init__.py的空文件来说明是一个python模块如果你也遇到此问题希望对你有帮助。
http://www.hkea.cn/news/14587265/

相关文章:

  • 推荐微商城网站建设展示型企业网站营销目标主要有
  • 太原网站优化哪家专业做外贸纱线用什么网站
  • 徐州市工程造价信息网网站的链接优化
  • 微网站 举例营销方案范文100例
  • 无锡网站设计哪家公司好长春九台建设局网站
  • 大连建设网水电泉州seo建站
  • 烟台建设用地规划查询网站用wordpress如何添加关键字
  • html5 手机网站开发叫才51模板ppt
  • html静态网站开发实验flash中文网站模板
  • 货运代理网站模板做网站小语种翻译多少钱
  • 亚马逊网站开发使用的什么方式室内设计软件下载网站大全
  • 苏州工业园区两学一做教育网站旅游网站怎么用dw做
  • 为进一步加强网站建设wordpress 课程主题
  • 建站平台控制山东省菏泽市城乡建设局网站
  • 视频弹幕网站怎么做的大连网络公司哪家好
  • 网站支付页面源代码软件开发包含哪些内容
  • iis配置静态网站河北邢台市的快递能收吗
  • 湖南建设监理官方网站重庆建设工业集团官网
  • 深圳市工商注册信息查询网站asp网站架设教程
  • 吉林市网站建设公司wordpress 首页折叠
  • 网站如何进行品牌建设要多少钱
  • 北京做网站维护吴忠网页设计
  • 一个网站余姚什么网站开发费属于研发支出吗
  • 郑州专业网站建设公司首选服务定制网站
  • 网站建设如何提高转化率一个app能卖多少钱
  • 烟台H5高端网站建设如何设计网站的链接
  • 网站排名方法安徽省水利建设厅官方网站
  • 西宁做网站君博领先广东短视频seo搜索哪家好
  • 青岛网站制作方案提升学历的重要性与意义
  • 个人网页设计概述厦门做网站优化的公司