• 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

  • 相关阅读:
    [转载]ASP.NET实现数字和字符相混合的验证码
    [分享]软件开发全套规范
    [转载]混沌理论简介
    [原创]利用WM_COPYDATA实现进程间通信
    [转载]I like the subtle...
    [原创]DES算法的介绍以及实现(含上次DES程序1.0的源码)
    [转载]高校自动排课系统的实践
    [公告]对DES算法源码的bug道歉
    [转载]基于混沌理论的资本投资研究
    使用 异步多线程TCP Socket 实现进程间通信(VC 6.0 , BCB6.0调试通过)
  • 原文地址:https://www.cnblogs.com/guanglin/p/3899071.html
Copyright © 2020-2023  润新知