Android初学者 小小笔记

UI

Layout  

  Common Layout

  Adapter Layout

InputControls

  Button

  TextFields

  CheckedBox  RadioButton

  SeekBar ProgressBar  RatingBar

InputEvents

  UI Commons

  ActionBar

  Dialog

  Notification

  Toast

App Resotuces

  drawable

  values

  layout

  menu

  xml`

Animation  Animator

  特效

Drawable  Canvas

 

消息模型API方法总结

  Message

   obj what arg1 arg2 target callable

   obtain()

   sendToTarget()

  MessageQueue

  Looper

   prepare()

   myLooper()

   getMainLooper()

   loop()

   quit()

  Handler

   sendMessage

   sendEmptyMessage

   

 

反射:

  得到drawable中的信息  可以采用 反射 先得到类对象 再通过类对象获得文件的名字 通过判定文件名的结束为.png

  从而通过 f.getInt(类对象) 得到图片的 id  添加到list集合  再通过 adapter 将图片显示到 view 

  Class<?> cla=MainActivity.class

 案例:

   sv为 searchView

   Class<?> c=sv.getClass();

   Field f=c.getDeclaredField("mQueryTextView");通过值 得到值对应的属性

   f.setAccessible(true);     因为此属性不可见  所以要进行此操作

   AutoCompleteTextView actv=(AutoCompleteTextView) f.get(sv);     得到 此对象的 这个属性的对象 通过此对象来 控制 属性的值 

   actv.setTextColor(Color.RED);               类 AutoCompleteTextView  通过继承关系找到

 

AutoCompleteTextView

   一个字符开始检索  就是 与输入的 那一个字符相同的 数组 全部 提示出来      acltv.setThreshold(1);

   监听事件:acltv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new String[]{"aa","ab","aa1"}));

 

 EditText

   android:ems="10"

   android:inputType="text"

   android:imeOptions="actionSearch"

   android:imeOptions="actionSend"

   监听:

   e1.setOnEditorActionListener(this);   实现接口 重写方法

        onEditorAction()

   划线:canvas.drawLine(0, getHeight()-2, getWidth(), getHeight()-2, p);  自定义view

 

searchView

  设置对象的监听  sv.setOnQueryTextListener();实现接口 重写方法

     sv.onActionViewExpanded()   

     onQueryTextChangeString newText)   数据发生改变时 就执行  也就是说 一直在监听的状态  参数为当前获得的 输入框中的输入的内容

        检索采用此方法  比较 的语句为 :

            adapter.getFilter().filterNewText);

     onQueryTextSubmit()      当点击 确定是 才调用 才执行

   另一种形式:

       int i=getResources().getIdentifier("android:id/search_plate", null, null);

LinearLayout ll=(LinearLayout) sv.findViewById(i);

ll.setBackgroundResource(R.drawable.sss);

 

TextView的监听

  tv.setOnTouvhListener();实现接口 重写方法  

     onTouch()

       event.getAction()==MotionEvent.ACTION_DOWN

 

ViewStub 

   延迟加载

      当点击其他按钮时 调用 vs.inflate()方法 开启vs

      android:id="@+id/vs1"                      vsid

      android:inflatedId="@+id/panel111111"      必须要设定的 但是id值随意

      android:layout="@layout/progressbar"       调用布局文件 布局文件中添加的是 要加载的 文件例如progressBar

 

ProgressBar

   将ProgressBar加载到布局中 通过 View 展现 将 此view 加载到 ListView 的 最顶端 或最低端

      View a=View.inflate(this, R.layout.shuaxin, null);

      getListView().addFooterView(a);

      getListView().addHeaderView(a);

 

ListView

   android:divider="#ff999999"

   android:dividerHeight="2dp"

   android:listSelector="@drawable/cai"

   lv.setOnItemClickListener()实现接口 重写方法

      onItemClickAdapterView<?> arg0, View arg1, int arg2, long arg3

         listview中存放的item中的list<String>的数据的类型 即为返回值类型  

         String s=Stringarg0.getItemAtPositionarg2);

 

ListActivity 中的ListView

   中采用setListAdapter()  来关联 adapter   其中有自己的 listview 所以自己不必定义 

   可以通过 获得getListView() 获得 ListView 对象 

   直接重写

        OnListItemClickListView l,

View v,        //v指向item view

int position, long id)方法  设置ListView的 点击事件

               l.getItemAtPositionposition);

    会直接显示到 布局文件中

   getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);   //设置选择模式为 多选

 

 

SimpleAdapter

   最烦人了  参数要求麻烦

   案例:new SimpleAdapter(this,

list,         //必须是MapString , ?》 类型的list的集合   可以通过 解析xml获得

R.layout.buju,     //每个item 的布局

new String[]{"title","content","image"},  每个map对象中均存在三组数据  

new int[]{R.id.textView1,R.id.textView2,R.id.imageView1});  将获得的对应的数据 存放到对应的 item 中的 相应的idshang  

 

Adapter

   创建view时  若存在 imageView  可以采用 

      iv.setImageURI(Uri.fromFile(new File(u.getI()))); 将图片添加到 布局中

 

ArrayAdapter

   布局中存在 textView 和 Button 时 

   定义一个类 继承 arrayadapter  

    在创建时 创建 新类的 类的对象  

    通过list 先给 TextView 赋值  然后 在新类中重写getView 方法  继续使用 父类的  方法 在父类的getView 方法的基础上 通过id 获得 Button

    然后给button 添加点击事件  删除对应的信息啦

    再添加 点击事件时  需要将 button 此个item 的 position进行绑定 或者 在方法中 定义一个新的 变量  给其赋值为 position

       并定义为 final 类型的  在匿名内部类中才可以进行访问 

       list.removepositon);

       刷新listView;   NotifyDateSetChanged();

 

联系人列表的右侧的 26个英文字母的 

   导航栏 采用ListView 背景设置为 点击背景 

      android:listSelector="@drawable/dianji2"    dianji2未设置的 drawable引用 shap  圆 设置了 半径和颜色

   将26个英文字母 添加到 adapter 对应的 item中   采用下列代码可以直接将 String——array 中的 name为 nav   的 中的item中的数据读出  布局采用haha

      ArrayAdapter.createFromResource(this, R.array.nav,R.layout.haha);

   设置ListView的点击事件 当点击时 得到对应的item中的 值 将值传给  联系人列表的 排序方法

          (就是迟到的那天老师讲的那个方法 分块 只显示 首字母相同的为一个快 只显示 最前面的 那个 item中的textView 其他的都隐藏

           就是在调用了 排序后 在 adapter中 建立 item时  比较 该item中的用户名字 的首字母 是否和 以前的item中的名字的首字母相同的  

           若没有相同的就将 该item中的 TextView 显示出来  否则就将 item中的 TextView 隐藏并且还不占用空间 )

    调用此方法 获得 第一个 首字母 与自己的相同的 item 的 position  

     将 zhegeposition 对应的 item 展示到 联系人 列表的最顶端  采用的方法为 :

        getListView().setSelectionFromToppositon30);据顶端的距离为 30dp

   取得name的 首字母  转换为大写   

   vh.tt1.setText(String.valueOf(u.getN().toUpperCase().charAt(0)));

   vh.tt1.setVisibility(View.VISIBLE);//显示

   vh.tt1.setVisibility(View.GONE);//不占用空间 隐藏

   android:divider="@null"    不用分隔线 导航栏

 

ExpandableListView

   设置 组展开

     explv.expandGroup(0);

   setadapter()  ;adapter 必须继承 BaseExpandableListAdapter  

   group[2]

   child[2][]; 有几个组  child中 就应该有几个对应的  一维数组

   表示返回的id是否是稳定 相同的id假如指向的元素永远是相同的那么就是稳定

@Override

public boolean hasStableIds() {

return false;

 }

   表示子元素是否可被点击,为true表示可以

@Override

public boolean isChildSelectable(int groupPosition, int childPosition) {

return true;

}

   重写方法

public boolean onChildClick()  设置 组中元素 即 child 的点击事件

 

Spinner

   下拉选择框  默认选中的是 arrayadapter 中 字符串数组的 第一个值

   得到选框中得值

   s.getSelectedItem()

 

Toast

   中的 context 可以是:getApplicationContext();

 

ViewPager

   instantiateItem()创建 item  将图片添加到 布局

   destroyItem() 移除文件

   onSizeChanged()得到当前布局的 宽 高

   invalidate();重绘 会调用 onDraw()方法;

   vp.setOnPageChangeListener(this);//事件监听  实现接口 重写相应方法

    onPageScrollStateChanged()  页面开始改变时执行一次

    onPageScrolled(int arg0, float arg1(偏移量), int arg2)   //一直在执行

    onPageSelected ()  页面改变完成后 执行一次

 

attars

   TypedArray ta=context.obtainStyledAttributes(attrs,R.styleable.Caicai);

   r=ta.getInteger(R.styleable.Caicai_r, 5);

   yeshu=ta.getInteger(R.styleable.Caicai_yeshu, 1);

   color=ta.getColor(R.styleable.Caicai_color, Color.parseColor("#ff00ff00"));

 

Paint 

   Paint p=new Paint(Paint.ANTI_ALIAS_FLAG);  消除锯齿

   p.setColor(Color.GREEN);   设置颜色

   p.setStyle(Style.STROKE);  设置 画的圆的样式 空心圆 实心圆 还是 圆环

 

View v  (补LineraLayout

    LinearLayout.LayoutParams llp=new LinearLayout.LayoutParams(10, 10);

    llp.leftMargin=5;

    v.setLayoutParams(llp);

Java

    v.setBackgroundResource(R.drawable.huadong);

    v.setEnabled(false);   

    //设置 此view 为 false 这是与  drawable.huadong  有关的   huadong中的 item 中 state_enabled

      false 时  和 为 true 是 背景色不同  用于显示不同的 颜色

    l.addViewv)      //可以添加 View 

    lLinearLayout.getChildAt(0).setEnabled(true);   可以得到 第一个 的view 并进行相应的设置

 

RadioGroupRadioButton 

   单选框

   rg.clearCheck();  清空选项

   int id=rg.getCheckedRadioButtonId();

   RadioButton rb=(RadioButton) rg.findViewById(id);

   CharSequence s=rb.getText();

 

SeekBar

   事件监听

   sb.setOnSeekBarChangeListener(this);

   实现接口 重写方法:

     onProgressChanged()   //一直在执行

     onStartTrackingTouch() //开始的时候执行

     onStopTrackingTouch()  //结束的时候执行

   android:max="100"    最大为100

   android:progress="10"  当前进度为 10

   android:secondaryProgress="90"    缓冲到 90

   android:thumb="@drawable/juxing"     滑动块 为 小矩形(自定义的)

   android:progressDrawable="@drawable/scrubber_progress_horizontal_holo_light"    (设置的背景色 不会的话去参考官方代码 自己去抄 名字就为 前边的名字 找不到 就去屎吧)

        

RatingBar  

   评价条:    

   android:numStars="5"   5颗星

   android:rating="3"      当前 满了 3

   android:stepSize="0.5"    半颗 半颗的增加

   android:isIndicator="true"   是否允许用户点击

 

ImageSwitcher

   直接 方法重写:makeView()  创建 ImageView 

       设置 iv的 大小  iv.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 

        iv.setImageResource(ima[0]);   图片显示

   imsw.setFactory(this);//设置工厂

   imsw.setAnimation(AnimationUtils.loadAnimation(this, android.R.anim.linear_interpolator));//设置动画

   点击事件  监听

     imsw.setOnTouchListener()  实现接口 重写方法

        onTouch()

            event.getAction()==MotionEvent.ACTION_DOWN

            event.getAction()==MotionEvent.ACTION_UP

            得到当前的坐标 x2=event.getX()  

            当两次的坐标相差多少时  来判定下次展示的图片

 

Menu

   系统启动后会直接调用方法onCreateOptionsMenu()创建菜单:

   直接重写方法onOptionsItemSelectedMenuItem item)  监听

       item.getItemId()  得到 菜单中点击的 item id

       Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

       startActivity(i);   //开启 菜单 相机 

       startActivityForResult(i, requestCode);  捕获照片 没讲

       Intent i2=new Intent(Intent.ACTION_CALL);

       i2.setData(Uri.parse("tel:110"));

       startActivity(i2);//打电话

   <!--菜单项       ID  顺序     不显示    有空间就显示  总是     收起collapse    标题-->

    <item

        android:id="@+id/action_settings"

        android:orderInCategory="100"

        android:showAsAction="always"

        android:title="彩儿"

        android:icon="@android:drawable/ic_menu_help"/>

 子菜单 

    <item

        android:id="@+id/action_settings1"

        android:orderInCategory="101"

        android:showAsAction="always"

        android:title="caicai"

        android:icon="@android:drawable/star_big_off">

        <menu >

            <item android:id="@+id/m1"

                android:orderInCategory="201"

                android:showAsAction="never"

                android:title=""

                android:icon="@android:drawable/stat_notify_call_mute"/>

            <item android:id="@+id/m2"

                android:orderInCategory="202"

                android:showAsAction="never"

                android:title="大笨蛋"

                android:icon="@android:drawable/stat_notify_chat"/>

        </menu>

    </item>

  java代码:

    MenuItem mi1=menu.add(1, 111, 102, "哈哈");

    mi1.setIcon(android.R.drawable.stat_notify_chat);

    mi1.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

    SubMenu mi11=menu.addSubMenu(2, 201, 220, "cai");//创建含有子菜单的菜单项

    MenuItem mi111=mi11.add(2, 202, 221, "chuxian");

    MenuItem mi112=mi11.add(2, 203, 222, "chuxian");

    补:java 代码 写的 子菜单在 菜单栏中不显示

 

上下文菜单:

   registerForContextMenu(getListView());//将 菜单 和 ListView 进行绑定吧     注册    

   重写方法:

     onCreateContextMenu()//基于上下文的长按菜单   当采用xml加载时  抄一下系统默认的调用菜单的格式就好了 加载上菜单

            得到选中的list的索引值 即为 id值 可通过 :

            AdapterContextMenuInfo acm=(AdapterContextMenuInfo) getMenuInfo();

            final int i=acm.position;

     onContextItemSelectedMenuItem item)菜单响应事件

         AdapterContextMenuInfo acm=(AdapterContextMenuInfo) item.getMenuInfo();

 final int i=acm.position;  //获得 选中的菜单的 id  通过id 去修改文件  switch();

              list.remove(i);         //得到的是 长按的列表的id adapterContextMenuInfo 中 封装的是 长按列表的索引信息

      aad.notifyDataSetChanged();

              文件删除后刷新

  

PopupMenu

    自己去想吧

    监听事件:popup.setOnMenuItemClickListener();重写方法

 

ActionBar

   ab=getActionBar();

   ab.setDisplayHomeAsUpEnabled(true);

   ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

   ab.addTab(ab.newTab().setText("菜菜").setTabListener(this));

     tab的监听事件:重写的方法:

        onTabReselected();

        onTabSelected();   vp.setCurrentItem(tab.getPosition());   tab 和 vp 的联动   ab.setSelectedNavigationItem(arg0);

        onTabUnselected();

   重写方法 onOptionsItemSelected(MenuItem item){   item.getItemId()==android.R.id.home    finish(); }

              系统给出的后退

 

onBackPressed();返回 方法

 

Notification

   Intent i=new Intent(this,NotiMainActivity.class);

   PendingIntent pi=PendingIntent.getActivity(this, 100(请求吗,随便写个值就好了!  设置延迟意图  当点击时 才执行 ),

                      i, PendingIntent.FLAG_UPDATE_CURRENT);

   RemoteViews v=new RemoteViews(getPackageName(), R.layout.ca);

v.setTextViewText(R.id.textView1, "倩倩");

v.setTextViewText(R.id.textView2, "youyou");

Notification n=new NotificationCompat.Builder(this)

                          .setContentText("笨蛋").setContentTitle("caier")

                          .setSmallIcon(R.drawable.ic_launcher).setTicker("音乐")

                          .setContent(v).build();

   n.flags=Notification.FLAG_AUTO_CANCEL;

   ntfm.notify(1, n);

   //ntfm.cancel(1);  在没有销毁的  另外两大事件

 

 

图片压缩:

    Options opts=new Options();

            //1.借助option对象封装选项信息

    Options opts=new Options();

    //2.设置Options对象的inJustDecodeBounds值为true

    //当此属性的值为true时,表示只读取图片的边界信息

    opts.inJustDecodeBounds=true;

    //3.读取图片边界信息,并将其信息封装到options对象

    BitmapFactory.decodeFile(

    pic.getPath(),opts);

    //4.获得图片边界信息

    int oHeight=opts.outHeight;

    int oWidth=opts.outWidth;

    Log.i("TAG", "oHeight="+oHeight);

    Log.i("TAG", "oWidth="+oWidth);

    //5.计算并设置压缩比例

    //获得window窗口显示信息,

    //并将其封装到DisplayMetrics对象中

    DisplayMetrics dm=new DisplayMetrics();

    getWindowManager()

    .getDefaultDisplay()

    .getMetrics(dm);

    int hPix=dm.heightPixels;

    int wPix=dm.widthPixels;

            int x=oWidth/wPix;

    int y=oHeight/hPix;

            opts.inSampleSize=y;

            //6.设置Options对象的inJustDecodeBounds值为false

    opts.inJustDecodeBounds=false;

    //7.读取文件内容

    Bitmap bitMap=BitmapFactory.decodeFile(

    pic.getPath(),opts);

        return bitMap;

    图片缓存

    File cache=//

    getExternalCacheDir();//context

    File newPic=new File(cache,"cacheql.JPG");

    OutputStream out=null;

    try{

    out=new FileOutputStream(newPic);

    bitMap.compress(CompressFormat.JPEG,100, out);//图片格式 压缩比例  写到哪儿

    out.close();

    }catch(Exception e){e.printStackTrace();}

 

 

this.getclass().getSimleName();

this.getclass().getName;           获得 包名 

 

SharedPreferences 

   spf=getSharedPreferences("caicai", MODE_PRIVATE);

   Editor e=spf.edit();

   e.putInt("a", 0);

   e.commit();

   int n=spf.getInt("a", 0);

 

File

   root=Environment.getExternalStorageDirectory();

   StatFs s=new StatFs(root.getPath());

   int totalSize=s.getBlockSize()*s.getBlockCount()/1024/1024;

 

数据存储的读写

   1.先检测内存有没有,内存有则直接显示

   a)内存中的缓存借助LruCache对象实现

   b)LruCache的底层实现是一个LinkedHashMap(能保证key的添加顺序)

   c)在使用LruCache应至少重写一个方法sizeOf

   2.检测磁盘中有没有,磁盘有就要读到内存,然后显示

   a)磁盘中的缓存是借助DiskLruCache实现

   b)具体数据操作(例如写数据)需要借助Editor对象

   3.磁盘没有,则从网络读取缓存到磁盘,然后在到内存进行缓存,然后显示

   

LruCache

   ActivityManager am=(ActivityManager) getSystemService(ACTIVITY_SERVICE);

   int i=am.getMemoryClass();

   int size=i*1024*1024/8;

   lc=new LruCache<String, Bitmap>(size){

      @Override

      protected int sizeOf(String key, Bitmap value) {

      return value.getByteCount();}};

   通过调用put  get 方法 存储数据 获得数据

     

DiskLruCache

   5

 

SQLite

   sqld=openOrCreateDatabase("cqq.db", MODE_PRIVATE, null);

   String sql="create table if not exists caicai(_id integer primary key,phone text not null,name text not null,created text not null)";

   sqld.execSQL(sql);

   String ins="insert into caicai values(0,'15297131753','菜菜','1993-09-21')";

   sqld.execSQL(ins);

   ContentValues c=new ContentValu` - 7-+ es();

   c.put("_id", 1);

   c.put("phone", "15110289192");

   sqld.insert("caicai", null, c);

   String s="select * from caicai where phone like ?";

   Cursor c=sqld.rawQuery(s, new String[]{"151%"});

   c.moveToFirst()

   c.moveToNext()

 

 

 

D:\software\android sdk_4_5_6\samples\android-23\ui\DisplayingBitmaps\Application\src\main\java\com\example\android\displayingbitmaps\util

 

 

ScheduledExecutorService ses=Executors.newSingleThreadScheduledExecutor();

ses.schedule(new Runnable() {

public void run() {

System.out.println(5);

}

}, 5, TimeUnit.SECONDS);//延迟5秒后 执行

 

 

/*ses.scheduleAtFixedRate(command,

initialDelay,   初始延迟

period,         下次任务的调度时间(无论上次任务有没有结束在period时间之后都会开启下一次调度)

unit)*/

/*ses.scheduleWithFixedDelay(command,

initialDelay,

delay,下次任务的调度时间(上次任务执行结束,再经过delay时间开始下一次的调度

unit)*/

 

Service

 绑定模式的service

     需要调用 bindService()方法 用于启动service

         调用 unbindService()方法 解除绑定 并停止 service

  在Mainactivity 中想直接采用 service 中的方法时 可以通过 Ibinder 方法 返回一个service对象  通过此对象 调用方法

       onCreate(用于执行初始化动作)  onBind 返回一个Ibinder接口的子类对象    onDestory() 用于释放资源

  可以认为 activity 是客户端 而service 是服务端 的C/S 架构

  Service 绑定机制支持跨进程通信

    通过onServiceConnected()方法 得到 service 返回的 值

 启动模式(StartService)  intentService 会自动创建 工作线程 执行耗时操作 

      intentService方法中的onHandleIntent方法 重写  运行在工作线程

 

音乐播放器:

   技术需求:SQLite  ContentProvider    AsyncTask    Service notifycation   MediaPlayer    Activity

                ContentResover  

 

BroadcastReceiver  广播

   一般广播  有序广播(设置 清单配置文件的 优先级)

   注册方式:动态注册 静态注册      sendBroadcast(。。。)发送广播

 

Fragment

   activity中的一个模块化组件   有自己独立的生命周期方法

   继承 Fragment      

   静态 :在activity的布局文件中配置 fragment  

   动态 :在activity代码中动态更新fragment

   viewpager   adapterfragmentPagerAdapter)   ItemFragment

 

Intent

   intent对象会由context对象的相关方法传递给底层Android系统

   显示intent(目标明确)

   隐式intent (目标不明确) 跨进程

    常用方式 setClass setAction  SetCoponent  setType   addCategory   put get

 

Activity

   启动 Activity   

     启动startActivityintent)   startActivityForResultintentrequestCode);

   启动 Service

     startServiceintent

     BindServiceintent

   发送广播

   sendBroadCastintent

   反射在程序运行时动态发现类中的属性  发  动态的执行相关方法

    通用编程     框架编程

   反射:  类名.class    类的对象.getClass();    Class.forName(“包名.类名”);、

ContentProvider  ContentResolver

   SQLiteDatabase   SQLiteOpenHelper  Cursor

   ContentProvider UriMatcher  ContentUris

   ContentResolver   context.getResolver()

   ContentProvider 类型的对象需要注册 (*^__^*) 嘻嘻……

           <provider

            android:name="com.example.day106_3_contentprovider.MyContentProvider"

            android:authorities="lalala"

            android:enabled="true"

            android:exported="true" >

           </provider>

    关联的数据一般为 内部存储  其生命周期由系统管理

 

Service 执行耗时操作

   service对象所在的进程生命力更顽强一些 不容易在内存不足时 被杀死

   启动模式(startServiceintent))

      onCreate1次)  onStartCommand(多次) onDestroy1次)

      可以调用stopService()停止  或在内部调用stopSelf()停止

   绑定模式(bindServiceintent))

      onCreate1次)  onStartCommand(多次) onDestroy1次)

      unBindService()停止

         Ibinder() binder() ServiceConnection();

   Service对象所在进程可以转换为前台进程 可以调用startForground0ntf)方法 将service进程转换为前台进程

     还可以调用stopForeground将其在转换为后台进程

   Service在被非正常停止时 可以自动启动  设置 粘性

   Service可以自动启动 可以借助广播的

   当activity中希望直接调用service中相关方法时 采用绑定模式更好

    

IntentService  

   适合应用在执行完任务以后自动停止的场合

 

BroadCastReceiver  广播

   Receiver对象类型

     一般广播(sendBroadcast())

     有序广播(sendOrderBroadcast())  

     当接收到广播以后会回调onReceiver()方法

    其生命周期取决于其注册方式:静态注册(清单配置文件)  动态注册  (receiver registerReceiver 注册  UNregisterReceiver

      getResultData();  setResultData();

你可能感兴趣的:(Android01)