AndroidAnnnotations注入框架使用之Injection标签详解(十)

 

 

(一).前言:

前面我们已经对于AndroidAnnotations框架的注入组件的方式做了讲解,今天我们开始具体学习一下Injection标签使用。

 

本博客已完成Injection更新如下:

AndroidAnnnotations注入框架使用之Injection标签详解(十)

(二).@AfterExtras

自AndroidAnnotations3.1起

如果你需要在extras注入之后执行相关代码,[email protected]

 

@EActivity
public class MyClass{
 
  @Extra
  String someExtra;
 
  @Extra
  int anotherExtra;
 
 
  @AfterExtras
  public void doSomethingAfterExtrasInjection(){
    // someExtra and anotherExtra are set tothe value contained in the incoming intent
    // if an intent does not contain one of theextra values the field remains unchanged
  }
 
}

 

(三).@AfterInject

如下的例子:[email protected],它的属性还没有被注入,如果你需要在编译的时候,依赖注入的之后执行相关的代码。你可以在需要执[email protected]

 

@EBean
public class MyClass{
 
  @SystemService
  NotificationManager notificationManager;
 
  @Bean
  MyOtherClass dependency;
 
  public MyClass() {
    // notificationManager and dependency arenull
  }
 
  @AfterInject
  public void doSomethingAfterInjection() {
    // notificationManager and dependency areset
  }
 
}
(四).@AfterViews

 

[email protected]被调用。

[注]当onCreate()方法被调用的时候,[email protected][email protected]

实例如下:

 

@EActivity(R.layout.main)
public classMyActivity extends Activity {
 
    @ViewById
    TextView myTextView;
 
    @AfterViews
    void updateTextWithDate() {
        myTextView.setText(Date:  +new Date());
    }
[...]
[email protected]住,在onCreate()方法不要使用任务View相关的属性。

 

 

@EActivity(R.layout.main)
public classMyActivity extends Activity {
 
    @ViewById
    TextView myTextView;
 
    @Override
    public void onCreate(BundlesavedInstanceState) {
        super.onCreate(savedInstanceState);
        // DON'T DO THIS !! It will throw aNullPointerException, myTextView is not set yet.
        // myTextView.setText(Date: + new Date());
    }
[...]
(五).@App

 

自AndroidAnnotations 2.1开始

[email protected]

 

@EActivity
public classMyActivity extends Activity {
  @App
  MyApplication application;
}
该同样在任何类型注入组件中进行使用,例如:@EBBean

 

 

@EBean
public class MyBean{
  @App
  MyApplication application;
}
(六).@Bean

 

在另一个注解类或者Android组件中使用这个注解类,[email protected];

 

@EBean
public classMyOtherClass {
  @Bean
  MyClass myClass;
}
同时你可以实现继承依赖关系

 

 

@EActivity
public classMyActivity extends Activity {
  @Bean
  MyOtherClass myOtherClass;
}
[email protected],你总会得到一个新的实例,除非那个类是一个单例。

 

值得我们注意的是,注解生成的子类是final类型的,也就是说我们不能在继承生成的类。但是我们可以扩展原始的类。扩展出来的类同样可以使用注解。如下:

 

@EActivity
public classMyChildActivity extends MyActivity {
}
(七).@Extra

 

自AndroidAnnotations1.0起

@Extra注解表示Activity中的属性应该注解成Intent中相应的Extra数据,由此用来打开Activity

使用实例如下:

 

@EActivity
public classMyActivity extends Activity {
 
  @Extra(myStringExtra)
  String myMessage;
 
  @Extra(myDateExtra)
  Date myDateExtraWithDefaultValue = newDate();
 
}
自AndroidAnnotations2.6起

 

[email protected],那么将会直接使用属性的名字。

 

@EActivity
public classMyActivity extends Activity {
 
  // The name of the extra will bemyMessage
  @Extra
  String myMessage;
}
你可以通过Intent构建起来传递额外的数据值

 

 

MyActivity_.intent().myMessage(hello).start();
(八).@FragmentArg

 

[email protected] Argument

生成的构建器的set方法总会使用argument相同的名字。默认情况下绑定值的key的名字就是该注入的属性的名字,[email protected]

实例:

 

@EFragment
public classMyFragment extends Fragment {
 
  @FragmentArg(myStringArgument)
  String myMessage;
 
  @FragmentArg
  String anotherStringArgument;
 
  @FragmentArg(myDateExtra)
  Date myDateArgumentWithDefaultValue = newDate();
 
}
使用Fragment构建器来进行使用。

 

 

MyFragmentmyFragment = MyFragment_.builder()
  .myMessage(Hello)
  .anotherStringArgument(World)
  .build();
(九).@[email protected]

 

[email protected],@EFragment,@Eview,@EViewGroup,@EBean,[email protected]@FragmentByTag来进行注入fragments。

[email protected]@FragmentByTag,因为后者没有编译时候的验证。

[email protected]@[email protected]它们只能存在于Activity中

 

@EActivity(R.layout.fragments)
public classMyFragmentActivity extends FragmentActivity {
  @FragmentById
  MyFragment myFragment;
 
  @FragmentById(R.id.myFragment)
  MyFragment myFragment2;
 
  @FragmentByTag
  MyFragment myFragmentTag;
 
  @FragmentByTag(myFragmentTag)
  MyFragment myFragmentTag2;
}
(十).@FromHtml

 

10.1.注入HTML

自AndroidAnnotations2.2起

如果你要TextView中注入HTML文本(可能因为格式问题或者你天生喜欢使用HTML),有下面两种方式帮到你:

  • @FromHtml
  • @HtmlRes

    现在我们假设有以下的字符串资源

     

     
    
        World!]]>
    
    10.2.@HtmlRes

     

    [email protected](获取字符串资源),然后进行包装进行调用HTML.fromHtml():

     

    @EActivity
    public classMyActivity extends Activity {
     
      // Injects R.string.hello_html
      @HtmlRes(R.string.hello_html)
      Spanned myHelloString;
     
      // Also injects R.string.hello_html
      @HtmlRes
      CharSequence helloHtml;
     
    }
    10.3.@FromHtml

     

    [email protected][email protected],该注解的目的就是设置HTML文本在TextView上面

     

    @EActivity
    public classMyActivity extends Activity {
     
      @ViewById(R.id.my_text_view)
      @FromHtml(R.string.hello_html)
      TextView textView;
     
      // Injects R.string.hello_html into theR.id.hello_html view
      @ViewById
      @FromHtml
      TextView helloHtml;
     
    }
    (十一).@HttpsClient

     

    自AndroidAnnotations2.6起

    11.1.简要介绍

    [email protected],[email protected]

    11.2.双向认证

    下面实例是一个完整的表单,如果你想实现验证,方式如下:

     

    @HttpsClient(trustStore=R.raw.cacerts,
        trustStorePwd=changeit,
        keyStore=R.raw.client,
        keyStorePwd=secret,
        allowAllHostnames=false)
    HttpClienthttpsClient;

     

    • trustStore:信任库
    • trustStorePwd:密码
    • keyStore:秘钥
    • keyStorePwd:秘钥密码
    • allowAllHostnames:允许的主机名

      简单的SSL身份认证如下:

       

      @HttpsClient(trustStore=R.raw.mycacerts,
          trustStorePwd=changeit)
      HttpClienthttpsClient;
      11.3.默认情况

       

      如果你没有指定信任的文件,注解会使用Android默认的信任库在/system/etc/security/cacerts.bks

       

      @HttpsClient
      HttpClienthttpsClient;
      11.4.使用实例

       

       

      @EActivity
      public classMyActivity extends Activity {
       
          @HttpsClient(trustStore=R.raw.cacerts,
              trustStorePwd=changeit,
              hostnameVerif=true)
          HttpClient httpsClient;
       
          @AfterInject
          @Background
          public void securedRequest() {
              try {
                  HttpGet httpget = newHttpGet(https://www.verisign.com/);
                  HttpResponse response =httpsClient.execute(httpget);
                  doSomethingWithResponse(response);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
       
          @UiThread
          public voiddoSomethingWithResponse(HttpResponse resp) {
              Toast.makeText(this, HTTP status + resp.getStatusLine().getStatusCode(), Toast.LENGTH_LONG).show();
          }
      }
      (十二).@NoConfigurationInstance

       

      自AndroidAnnotations2.5开始

      12.1.简要介绍

      当Configuration发生改变的时候,Activity通常会被销毁然后重新创建。这样会重新加载资源。这样就涉及一个从就对象到新Activity实例的引用问题(例如:加载图片,网络连接,Activity运行的线程…)

      这就是Activity.onRetainNonConfigurationInstance()用来解决这个问题。

      12.2.@NonConfigurationInstance

      [email protected]进行注解,在配置信息发生改变的时候来保存实例。

       

      @EActivity
      public classMyActivity extends Activity {
       
        @NonConfigurationInstance
        Bitmap someBitmap;
       
        @NonConfigurationInstance
        @Bean
        MyBackgroundTask myBackgroundTask;
       
      }
      (十三).@RootContext

       

      [email protected]@RootContext注入Android根组件,不过需要主要的时候只能注入上下文相关类型的。

       

      @EBean
      public class MyClass{
       
        @RootContext
        Context context;
       
        // Only injected if the root context is anactivity
        @RootContext
        Activity activity;
       
        // Only injected if the root context is aservice
        @RootContext
        Service service;
       
        // Only injected if the root context is aninstance of MyActivity
        @RootContext
        MyActivity myActivity;
       
      }
      (十四).@SystemService

       

      自AndroidAnnotations1.0起

      14.1.Android系统标准服务注入

      使用标准的系统服务,我们需要记得系统服务的常量名字,然后进行强制转换获取。

       

      notificationManager= (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
      14.2.@SystemService

       

      [email protected]ndroid系统服务,该等同于调用Context.getSystemService()方法。

       

      @EActivity
      public classMyActivity extends Activity {
       
        @SystemService
        NotificationManager notificationManager;
       
      }
      (十五).@ViewById

       

      [email protected]中的View组件。等同于调用findViewById()方法。该View的id可以设置在注解的参数中,[email protected](R.id.myTextView)。如果没有设置,将会使用字段的的名字。并且字段不能为私有的。实例如下:

       

      @EActivity
      public classMyActivity extends Activity {
       
        // Injects R.id.myEditText
        @ViewById
        EditText myEditText;
       
        @ViewById(R.id.myTextView)
        TextView textView;
      }
      (十六).@ViewsById

       

      自AndroidAnnotations3.1起

      [email protected][email protected][email protected][email protected][email protected]

       

      到此位置关于AndroidAnnotations注解Injection标签使用方法已经全部讲解完成了。

       

更多相关文章
  • 我们前面已经讨论过了如何在一个网站中集成最基本的Membership功能,然后深入学习了Membership的架构设计.正所谓从实践从来,到实践从去,在我们把Membership的结构吃透之后,我们要完善它,改造它,这样我们才能真正学以致用.今天我们将以用户信息为主线,从SqlMembershipP ...
  • 内存中OLTP是关于内存中的一切.但那只是对了一半.在今天的文章里我想给你展示下,当你从内存读取数据时,即使内存中OLTP也会引起磁盘活动.这里的问题是执行计划里,不正确的统计信息与排序(sort)运算符的组合. 排序(sort)运算符问题 我们都知道,排序(sort)运算符需要所谓的内存授予(Me ...
  • 链接在这
  • Discard Old Builds:hudson默认保留过去的构建,勾选此选项,则可以设置构建记录的有效期:(帮助:这里控制着您想要在hudson所在的磁盘把构建记录存储的有效期:Hudson为此提供两个标准:1.时间驱动-在hudson中您可以判断如果达到一定时限来删除一条记录(例如7天前):2 ...
  • 第五讲 Visual Odometry (视觉里程计) 读者朋友们大家好,又到了我们开讲rgbd slam的时间了.由于前几天博主在忙开会拍婚纱照等一系列乱七八糟的事情,这一讲稍微做的慢了些,先向读者们道个歉! 上几讲中,我们详细讲了两张图像间的匹配与运动估计.然而一个实际的机器人总不可能只有两个图 ...
  • 上一篇:http://www.2cto.com/Article/201212/174596.html 一:Dedecms变量覆盖新型绕过:  请看看文件:include/filter.inc.php  引用一哥话语:  这是2B的dede再次变量覆盖漏洞根源..  这是过滤或替换非法关键字.正常的. ...
一周排行
  • FlatBuffers去年发布,最近看了一下,与同是出自Google之手的Protocol Buffers非常类似.在官网上介绍,FlatBuffers(简称FB)主要针对game development和对性能有要 ...
  • 前几天开始跑一份数据名单,名单需要提供用户名.是否有手机号.是否有邮箱,用户名单我轻易的获取到了,但是,用户名单有2000w之多,并且去检测用户是否有手机号.是否有邮箱必须得通过一个对外开放的安全接口一个一个用户去请 ...
  • 美国知名拆解机构iFixit周四拆开苹果iPhone 4S,发现它使用了高通的无线芯片组.iFixit一直因为拆解.披露苹果设备组件而闻名.iPhone 4S还采用了苹果A5处理器,频率为1GHZ.iFixit表示, ...
  • 早报讯 黑客近期活动频密.日本游戏研发企业世嘉株式会社19日宣布,因Pass网络系统遭遇黑客攻击,130万游戏用户个人信息失窃.世嘉在一份声明中说,用户姓名.出生日期.电子邮箱地址和登录密码失窃,但包括信用卡号在内的 ...
  • 代码如下: #define OTL_BIGINT long long #define OTL_STR_TO_BIGINT(str,n) \ { \ n=atoll(str); \ } #define OTL_BIGI ...
  • 已知一个json对象是这样的格式:   var json={ r1:'123', r2:'123', r3:'123', r4:'123', r5:'123', r6:'123', r7:'123', r8:'123 ...
  •   stack, deque 和 queue这三个c++的STL的数据结构很类似但又各有不同. stack是堆栈,没有迭代器,特点是后进先出.用push()将元素压入栈中,top()返回栈顶元素,pop()移除栈顶元 ...
  • @charset "utf-8"; /* CSS Document */ html,body{ margin:0; padding:0; font-family:"宋体"; f ...
  • 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版.作者信息和本声明.否则将追究法律责任.http://blog.csdn.net/topmvp - topmvpA completely upda ...
  • 今年的金球奖真无聊 足球场上,最令人难受的就是看巴西球员和法国球员踢球.因为这两类球员踢球花哨太多,阴气太重,巴西球员更带一丝妖气.缺少男人最基本的阳刚之美…… 所以巴西球员卡卡拿金球奖真无聊,手捧世界杯和欧洲冠军杯 ...