Android Annotations 介绍

来源:互联网 发布:iphone6s连不上网络 编辑:程序博客网 时间:2024/05/18 17:45

开发过程中看到别人使用了Android Annotations的代码,该代码是一个第三方框架,通过注释来开发应用。使用Android Annotations能够大大减少代码量。

请看下面的Java代码

  1. package com.googlecode.androidannotations.helloworldeclipse;

  2. importjava.util.Date;
  3. importjava.util.concurrent.TimeUnit;

  4. import android.app.Activity;
  5. import android.app.Notification;
  6. import android.app.NotificationManager;
  7. import android.app.PendingIntent;
  8. import android.content.Intent;
  9. import android.database.sqlite.SQLiteDatabase;
  10. import android.os.Bundle;
  11. import android.util.Log;
  12. import android.view.MotionEvent;
  13. import android.view.View;
  14. import android.view.Window;
  15. import android.view.WindowManager;
  16. import android.widget.EditText;
  17. import android.widget.TextView;
  18. import android.widget.Toast;

  19. import com.googlecode.androidannotations.annotations.Background;
  20. import com.googlecode.androidannotations.annotations.Click;
  21. import com.googlecode.androidannotations.annotations.EActivity;
  22. import com.googlecode.androidannotations.annotations.LongClick;
  23. import com.googlecode.androidannotations.annotations.SystemService;
  24. import com.googlecode.androidannotations.annotations.Touch;
  25. import com.googlecode.androidannotations.annotations.Transactional;
  26. import com.googlecode.androidannotations.annotations.UiThread;
  27. import com.googlecode.androidannotations.annotations.ViewById;
  28. import com.googlecode.androidannotations.annotations.res.BooleanRes;
  29. import com.googlecode.androidannotations.annotations.res.ColorRes;
  30. import com.googlecode.androidannotations.annotations.res.StringRes;

  31. @EActivity(R.layout.my_activity)//布局文件在这里声明,不用在setContentView
  32. publicclass MyActivityextendsActivity{

  33.     @ViewById //控件这样标注,由于是IOC模式,因此不需要自己实例化
  34.     EditText myEditText;

  35.     @ViewById(R.id.myTextView)//提供id来生成控件,如果不指定ID,默认以控件名进行查找,如上面的myEditText
  36.     TextView textView;

  37.     @StringRes(R.string.hello)//资源
  38.     String helloFormat;

  39.     @ColorRes
  40.     int androidColor;

  41.     @BooleanRes
  42.     boolean someBoolean;

  43.     @SystemService
  44.     NotificationManager notificationManager;

  45.     @SystemService
  46.     WindowManager windowManager;

  47.     /**
  48.      * AndroidAnnotations gracefully handles support for onBackPressed, whether
  49.      * you use ECLAIR (2.0), or pre ECLAIR android version.
  50.      */
  51.     public void onBackPressed(){
  52.         Toast.makeText(this,"Back key pressed!", Toast.LENGTH_SHORT).show();
  53.     }
  54.     
  55.     @Override
  56.     protectedvoid onCreate(Bundle savedInstanceState){
  57.         super.onCreate(savedInstanceState);
  58.         // windowManager should not be null
  59.         windowManager.getDefaultDisplay();
  60.         requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
  61.     }


  62.     @Click //事件控制,可以以按钮的id作为方法名,同时支持的事件还有onLongClick,onTextChange等
  63.     void myButtonClicked(){
  64.         Stringname= myEditText.getText().toString();
  65.         setProgressBarIndeterminateVisibility(true);
  66.         someBackgroundWork(name, 5);
  67.     }

  68.     @Background //开启新线程后台运行,注意不要引用UI控件,而且返回值类型一定是void
  69.     void someBackgroundWork(Stringname,long timeToDoSomeLongComputation){
  70.         try {
  71.             TimeUnit.SECONDS.sleep(timeToDoSomeLongComputation);
  72.         } catch (InterruptedException e){
  73.         }

  74.         String message=String.format(helloFormat,name);

  75.         updateUi(message, androidColor);

  76.         showNotificationsDelayed();
  77.     }

  78.     @UiThread //UI线程
  79.     void updateUi(String message,intcolor){
  80.         setProgressBarIndeterminateVisibility(false);
  81.         textView.setText(message);
  82.         textView.setTextColor(color);
  83.     }

  84.     @UiThread(delay=2000)//可以设置延时时间,以毫秒为单位
  85.     void showNotificationsDelayed(){
  86.         Notificationnotification=new Notification(R.drawable.icon,"Hello !", 0);
  87.         PendingIntent contentIntent = PendingIntent.getActivity(this, 0,new Intent(), 0);
  88.         notification.setLatestEventInfo(getApplicationContext(),"My notification","Hello World!", contentIntent);
  89.         notificationManager.notify(1,notification);
  90.     }

  91.     @LongClick
  92.     void startExtraActivity(){
  93.         Intent intent = new Intent(this, ActivityWithExtra_.class);

  94.         intent.putExtra(ActivityWithExtra.MY_DATE_EXTRA,newDate());
  95.         intent.putExtra(ActivityWithExtra.MY_STRING_EXTRA,"hello !");
  96.         intent.putExtra(ActivityWithExtra.MY_INT_EXTRA, 42);

  97.         startActivity(intent);
  98.     }

  99.     @Click
  100.     void startListActivity(View v){
  101.         startActivity(new Intent(this, MyListActivity_.class));
  102.     }

  103.     @Touch
  104.     void myTextView(MotionEventevent){
  105.         Log.d("MyActivity","myTextView was touched!");
  106.     }

  107.     @Transactional
  108.     int transactionalMethod(SQLiteDatabase db,int someParam){
  109.         return 42;
  110.     }

  111. }
一些常用注释的使用方法:
@AfterInject 定义的方法在类的构造方法执行后执行
@AfterTextChange定义的方法在TextView及其子类的Text属性改变后执行
@AfterViews 定义的方法在setContentView后执行
@Background 定义的方法在后台线程执行
@BeforeTextChange 定义的方法在TextView及其子类的Text属性改变前执行
@Click 定义点击监听器
@EActivity 在Activity中启用Annotations
@EProvider 在 ContentProvider中启用Annotations
@EReceive 在BroadcastReceiver中启用Annotations
@EService 在Service中启用Annotations
@EView 在自定义的View的子类中启用Annotations
@Fullscreen 全屏
@NoTitle 无标题栏

 

Annotation有个问题:不能直接这样定义命名为id:int id=0;如果要这样定义要定义成private或public,否则会报错,要么可以这样定义:int ids=0;总之就是不能直接命名为id,否则会冲突


掌握这些注视对读懂利用该第三方代码开发的代码非常有帮助,同时对利用该代码开发的APK文件反编译的解释能够有更深入的了解。


0 0
原创粉丝点击