zoukankan      html  css  js  c++  java
  • Android学习(一)

      好久不写博客了,自上次写到现在已经一年多了,写这东西其实坚持下来就好了,将自己学的东西一点点写出来成为日后的积累查阅的资料。最近不是特别忙,抽点时间学学移动开发。

    Android组件中常用的四大组件

      1.Activity

      2.Service服务

      3.Content Provider内容提供者

      4.BroadcastReceiver广播接收器

    一、Activity

      大家第一眼看到这个东西的时候,肯定想问这是个什么东西?打开手机随便打开一个应用,看到的屏幕就是一个Activity,点击按钮进入另一屏幕,这也是一个Activity,一个Activity通常就是指一个单独的屏幕,你所见的按钮、输入框等就承载在Activity上,你可以把它看成web中的一个页面,WinForm中的一个Frame, wpf中的一个Window,它就是一个可以承载控件的容器将你界面上的布局呈现给你。

      1.Activity生命周期

        经典的生命周期图,不多做解释,清晰明了,图中也给出了Activity中的函数调用关系,这里我需要强调一下需要注意的地方。

          1.当一个界面被全部覆盖和部分覆盖所调用的函数式有所不同的,当前页面被遮盖一部分时,onStop()不会被调用,再次被激活时onStart()也不会被调用,从图上也可以看出有这条路径,当全部覆盖时,这两个函数才会被调用。

          2.另外需要注意的是最左边的那条线,当内存不足时,不处于激活状态的Activity可能会被回收掉,所以不处于激活状态的Activity需要注意保存当前页面的状态,以便在再次创建的时候恢复被杀死前的状态。状态保存我们需要重写public void onSaveInstanceState(Bundle outState) 将数据放入outState这个Bundle(看成Java中的Map,C#中的Dictionary,就是存放键值对)中,在onCreate的时候恢复即可。这一还有需要注意的一点:onSaveInstanceState()并不是永远都会调用。比如,当用户在一个activity上按返回时,就不会调用,因为用户此时明确知道这个activity是要被销毁的,并不期望下次它的样子跟现在一样。

      

      2.页面数据传递

        页面的数据传递离不开Intent,又是一个新奇的玩意,百度一下,中文翻译成意图,意图是个什么东西,感觉翻译的好生硬,完全就是英文字典中的翻译嘛,看下百度百科中的解释:

          Intent(意图)主要是解决Android应用的各项组件之间的通讯。

          Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
      
        解释还算可以最起码看了大概知道它是干什么用的了,下面看下怎么用
        (1)传数据到新页面, Intent存放数据跟Bundle一模一样,他们继承自相同的接口(Parcelable, Cloneable)。如下代码,其中name是你自己定义的键值,value是要传递的数据,这里传递的数据只可以是基本数据类型和可序列化的类型,一般对象不可以传递。
      //传递页面
     Intent intent = new Intent(); intent.putExtra(name, value) intent.setClass(this, Activity.class);//这里参数Activity是示例,需要替换成你要打开页面的名字 this.startActivity(intent);


     //接收页面
      protected void onCreate(Bundle savedInstanceState){

       //savedInstanceState.getString(key);
     
        //savedInstanceState.getInt(key);
     
        //savedInstanceState.getBundle(key);
    }

        (2)获取其它页面的返回值,这个需要继承LoaderCallbacks<Cursor>接口,并重写onActivityResult函数,这个函数第三个参数就是我们需要获取数据的地方。

    public class MainActivity extends Activity implements LoaderCallbacks<Cursor> {
    
      ......
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {    
        //获取其它页面返回值
        //intent.getBooleanArrayExtra(name)
      
        //intent.getBundleExtra(name)
      
        //intent.getStringExtra(name)
     
        Uri uri = intent.getData();  } }

        上面代码 Uri uri = intent.getData();这里调用一些系统页面时,数据会以Uri形式返回,例如:

            //获取音乐列表界面
         Intent intent = new Intent(); intent.setType("audio/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, 22);      //获取相册界面 Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, 22);

      3.Activity之菜单

        当我们点击手机左下角的按钮时,界面底部一般会弹出一个菜单,这个菜单可以从xml创建,也可以从代码创建,以下是实现代码:

        // 创建菜单处理
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
    
            super.onCreateOptionsMenu(menu);
    
            // 从xml创建菜单
            // getMenuInflater().inflate(R.menu.main, menu);
            /**
            * add()方法的四个参数,依次是: 
             * 1、组别,如果不分组的话就写Menu.NONE,
            * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单 
             * 3、顺序,那个菜单现在在前面由这个参数的大小决定
             * 4、文本,菜单的显示文本
             */
    
            menu.add(Menu.NONE, MenuIds.PlayOrPause, 1, MenuTitles.Play);
            menu.add(Menu.NONE, MenuIds.EditMusic, 2, MenuTitles.EditMusic);
            menu.add(Menu.NONE, MenuIds.EditImages, 3, MenuTitles.EditImages);
            return true;
        }

    这里的Id跟title使用内部类定义的常量,这里贴出来可以作为参考:

        // 定义菜单id
        private static class MenuIds {
            public static final int PlayOrPause = Menu.FIRST + 1;
            public static final int EditMusic = Menu.FIRST + 2;
            public static final int EditImages = Menu.FIRST + 3;
        }
    
        // 定义菜单显示文本
        private static class MenuTitles {
            public static final CharSequence Play = "播放";
            public static final CharSequence Pause = "暂停";
            public static final CharSequence EditMusic = "编辑音乐";
            public static final CharSequence EditImages = "编辑照片";
        }

    这样就可以在按下左下角按键时,在底部出现系统菜单,还有一步需要做,就是点击菜单时的事件处理:

        // 菜单项被选择事件
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
    
            switch (item.getItemId()) {
            case MenuIds.PlayOrPause:
                if (isPalying) {
                    Pause();
                } else {
                    Play();
                }
                break;
            case MenuIds.EditImages:
                EditImages();
                break;
            case MenuIds.EditMusic:
                EditMusic();
                break;
            }
            return true;
        }

    另外还有几个可以能会用到的菜单事件:

        // 创建菜单前对菜单进行处理
        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
    
            MenuItem playOrPause = menu.findItem(MenuIds.PlayOrPause);
            if (isPalying) {
                playOrPause.setTitle("暂停");
                // playOrPause.setIcon(R.drawable.pause);
            } else {
                playOrPause.setTitle("播放");
                // playOrPause.setIcon(R.drawable.play);
            }
            // 如果返回false,onCreateOptionsMenu方法将不会被调用
            return true;
        }
    
        // 菜单关闭时触发
        // 选项菜单被关闭事件,菜单被关闭有三种情形,
        // menu按钮被再次点击、back按钮被点击或者用户选择了某一个菜单项
        @Override
        public void onOptionsMenuClosed(Menu menu) {
    
        }

    4.Activity之布局

      做界面,不对界面控件了解的炉火纯青,上起手来还是会力不从心,事半功倍,做不出想要的效果。

      Android布局类型主要有四种,分别是LinearLayout(线性布局)、RelativeLayout(相对布局)、TableLayout(表格布局)、FrameLayout(帧布局)。

    虽然这里名字基本可以见名知义,不动动手做做,心里还是没有底。

      这里网上搜到篇文章,解释用法已经很清楚了,借用一下:http://blog.csdn.net/wyd458549392147/article/details/7051417

    本文来自博客园,作者:广林,转载请注明原文链接:https://www.cnblogs.com/guanglin/p/3899071.html

  • 相关阅读:
    tile38 复制配置
    The Guardian’s Migration from MongoDB to PostgreSQL on Amazon RDS
    tile38 一款开源的geo 数据库
    sqler sql 转rest api 的docker 镜像构建(续)使用源码编译
    sqler sql 转rest api javascript 试用
    sqler sql 转rest api redis 接口使用
    sqler sql 转rest api 的docker image
    sqler sql 转rest api 的工具试用
    apache geode 试用
    benthos v1 的一些新功能
  • 原文地址:https://www.cnblogs.com/guanglin/p/3899071.html
Copyright © 2011-2022 走看看