美文网首页
Android 基础

Android 基础

作者: 小甜妮子__ | 来源:发表于2017-02-18 14:00 被阅读16次

    1.四大组件以及生命周期
    (1)Intent :动作(MAIN,VIEW,EDIT,PICK等),动作携带的数据
    IntentFilter:都定义在AndroidManifest.xml文件中,最常见的例如应用主入口:
    <intent-filter>
    <action android:name = "android.intent.action,MAIN"/>
    <category android:name = "android.intent.category.LAUCHER"/>
    </intent-filter>
    (2)Activity生命周期

    0_12803210018q71.gif

    (3)BroadcastReceiver
    生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报ANR(Application No Response) 程序无响应的错误信息,如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由Service 来完成 . 这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的。

    (4)Serivce:
    一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。

    (5)Content Provider
    android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式;
    其他应用可以通过ContentResolver类,从该内容提供者中获取或存入数据;
    优点:统一数据访问方式。
    android系统自带的内容提供者(顶级的表示数据库名,非顶级的都是表名)这些内容提供者在SDK文档的android.provider Java包中都有介绍。见:http://developer.android.com/reference/android/provider/package-summary.html
    ├────Browser
    ├────CallLog
    ├────Contacts
    │ ├────Groups
    │ ├────People
    │ ├────Phones
    │ └────Photos
    ├────Images
    │ └────Thumbnails
    ├────MediaStore
    │ ├────Albums
    │ ├────Artists
    │ ├────Audio
    │ ├────Genres
    │ └────Playlists
    ├────Settings
    └────Video
    URI的基本格式:
    结构头://域名/路径
    content://com.bravestarr.provider.personprovider/person/10
    结构头固定为content://
    域名一般为应用程序包名
    路径:表明/记录行号

    2.List View的基本使用和优化
    <pre>
    //新建一个类继承BaseAdapter,实现视图与数据的绑定
    privateclass MyAdapter extends BaseAdapter {
    //得到一个LayoutInfalter对象用来导入布局
    private LayoutInflater mInflater;
    </br>
    //构造函数
    public MyAdapter(Context context) {
    this.mInflater = LayoutInflater.from(context);
    }

        @Override
        publicint getCount() {
            
            return getDate().size();//返回数组的长度
        }
    
        @Override
        public Object getItem(int position) {
            returnnull;
        }
    
        @Override
        publiclong getItemId(int position) {
            return 0;
        }
        /*书中详细解释该方法*/
        @Override
        public View getView(finalint position, View convertView, ViewGroup parent) {
             ViewHolder holder;
            //观察convertView随ListView滚动情况
             Log.v("MyListViewBase", "getView " + position + " " + convertView);
            if (convertView == null) {
                     convertView = mInflater.inflate(R.layout.item,null);
                     holder = new ViewHolder();
                    /*得到各个控件的对象*/
                    holder.title = (TextView) convertView.findViewById(R.id.ItemTitle);
                    holder.text = (TextView) convertView.findViewById(R.id.ItemText);
                    holder.bt = (Button) convertView.findViewById(R.id.ItemButton);
                    convertView.setTag(holder);//绑定ViewHolder对象
              }else{
                    holder = (ViewHolder)convertView.getTag();//取出ViewHolder对象
              }
            /*设置TextView显示的内容,即我们存放在动态数组中的数据*/
            holder.title.setText(getDate().get(position).get("ItemTitle").toString());
            holder.text.setText(getDate().get(position).get("ItemText").toString());
            
            /*为Button添加点击事件*/
             holder.bt.setOnClickListener(new OnClickListener() {
                
                @Override
                publicvoid onClick(View v) {
                Log.v("MyListViewBase", "你点击了按钮" + position);                                //打印Button的点击信息
                    
                }
            });
            
            return convertView;
        }
    
    }
    

    /存放控件/
    publicfinalclass ViewHolder{
    public TextView title;
    public TextView text;
    public Button bt;
    }
    }
    </pre>
    当启动Activity呈现第一屏ListView的时候,convertView为零。当用户向下滚动ListView时,上面的条目变为不可见,下面出现新的条目。这时候convertView不再为空,而是创建了一系列的convertView的值。当又往下滚一屏的时候,发现第11行的容器用来容纳第22行,第12行的容器用来容纳第23行。也就是说convertView相当于一个缓存,开始为0,当有条目变为不可见,它缓存了它的数据,后面再出来的条目只需要更新数据就可以了,这样大大节省了系统资料的开销。

    还可以继续优化。虽然重复利用了已经绘制的view,但是要得到其中的控件,需要在控件的容器中通过findViewById的方法来获得。如果这个容器非常复杂,这显然会增加系统资源的开销。在上面的例子中,引入了Tag的概念。或许不是最好的办法,但是它确实能使ListView变得更流畅。代码中,当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。当convertView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件
    当启动Activity呈现第一屏ListView的时候,convertView为零。当用户向下滚动ListView时,上面的条目变为不可见,下面出现新的条目。这时候convertView不再为空,而是创建了一系列的convertView的值。当又往下滚一屏的时候,发现第11行的容器用来容纳第22行,第12行的容器用来容纳第23行。也就是说convertView相当于一个缓存,开始为0,当有条目变为不可见,它缓存了它的数据,后面再出来的条目只需要更新数据就可以了,这样大大节省了系统资料的开销。

    还可以继续优化。虽然重复利用了已经绘制的view,但是要得到其中的控件,需要在控件的容器中通过findViewById的方法来获得。如果这个容器非常复杂,这显然会增加系统资源的开销。在上面的例子中,引入了Tag的概念。或许不是最好的办法,但是它确实能使ListView变得更流畅。代码中,当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。当convertView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件

    2011120509320962.png

    3.Fragment
    (1)碎片(直译)
    (2)Fragment的添加方式
    Xml中使用<fragment>标签添加:
    <pre>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false" >

    <fragment
        android:id="@+id/fragment1"
        android:name="com.example.fragmentdemo.Fragment1"
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="1" />
    
    <fragment
        android:id="@+id/fragment2"
        android:name="com.example.fragmentdemo.Fragment2"
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="1" />
    

    </LinearLayout>
    </pre>
    以及在Activity种动态添加:
    <pre>
    public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Display display = getWindowManager().getDefaultDisplay();
        if (display.getWidth() > display.getHeight()) {
            Fragment1 fragment1 = new Fragment1();
            getFragmentManager().beginTransaction().replace(R.id.main_layout, fragment1).commit();
        } else {
            Fragment2 fragment2 = new Fragment2();
            getFragmentManager().beginTransaction().replace(R.id.main_layout, fragment2).commit();
        }
    }
    

    }
    </pre>
    (3)动态添加Fragment的步骤:
    --获取Fragment Manager,在Activity种直接通过getFragmentManager()获取;
    --开启一个事物,通过beiginTransaction获取;
    --向容器内添加Fragment,一般使用replace方法实现,需要传入容器的id和Fragment的实例;
    --提交事务,调用commit方法提交。
    (4)Fragment生命周期:
    和Activity很相似,只是多出几个新的方法:
    onAttach方法:Fragment和Activity建立关联的时候调用。
    onCreateView方法:为Fragment加载布局时调用。
    onActivityCreated方法:当Activity中的onCreate方法执行完后调用。
    onDestroyView方法:Fragment中的布局被移除时调用。
    onDetach方法:Fragment和Activity解除关联的时候调用。

    相关文章

      网友评论

          本文标题:Android 基础

          本文链接:https://www.haomeiwen.com/subject/mxurwttx.html