• Android知识细节


    1、一个activity就要有一个布局,所以新建一个Activity的时候总会新建一个相应的layout

    public class MyAty extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.myaty);//将视图与Activity绑定
        }
    }
    

      可以看到setContentView()就是讲视图与布局绑定的。除此之外,还需要将这个Activity在AndroidMainfest.xml注册。

      总结:创建一个Activity需要三个步骤:一、创建一个Activity的java类;二、创建这个Activity的布局xml,并将这两个绑定;三、在AndroidMainfest.xml中注册这个Activity。

      当然,你也可以不用这个xml格式的layout,比如: 

     private TextView tv;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //这里的tv有访问res的能力,就好像具备了layout的性质。
            // 我们知道MainActivity也是继承了Context的。而有了Context就有了访问res的能力。
            tv=new TextView(MainActivity.this);
            tv.setText("HelloAndroid!");
            
            //不用layout的布局,而是自己创建了一个TextView tv
            //setContentView(R.layout.activity_main);
            setContentView(tv);
        }
    

      

      

    2、Activity的生命周期

    3、Activity的之间的参数传递,用Intent i;i

    4、打开一个新的Activity,用startActivity()函数就好了:

            startnewbtn=(Button)findViewById(R.id.startANewActivity);
    
            startnewbtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //
                    startActivity(new Intent(MainActivity.this,BActivity.class));
                }
            });    
    

      这个startnewbtn是Button的对象,他是在MainActivity中的一个组件,单击他可以到BActivity。

    4、Bundle是指一个数据包,其中有很多的数据,就像php中的数组。传递数值:

    现在第一个Activity中:

                //打开一个新的activity
                startnewbtn=(Button)findViewById(R.id.startANewActivity);
    
                startnewbtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //
                    //startActivity(new Intent(MainActivity.this,BActivity.class));
                    Intent i=new Intent(MainActivity.this,BActivity.class);
    //                i.putExtra("first","来自MainActivity的第一个参数!");//这个是传递一个值
                    Bundle b=new Bundle();//传递一个数据包Bundle
                    b.putString("first","第一个参数!!");
                    b.putInt("second",2);
                    b.putChar("third",'c');
                    i.putExtras(b);
    //                i.putExtra("mybundle",b);//传递bundle的第二种方法
    
                    startActivity(i);
    
                }
            });
    

      接着在第二个中接受参数:

    private TextView tv;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_b);
    
            Intent i=getIntent();
            String str=i.getStringExtra("first");
    
            tv= (TextView) findViewById(R.id.tv);
            tv.setText(str);
        }
    

      

    5、Intent不但是连接两个Activity的胶水,还是传递函数的管道。

    6、在MainActivity.xml中问什么Activity的name属性前面都要有一个点“.”,因为这个会跟前

        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="info.baitian.test" >
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

      的info.baitian.test连接在一起。

    7、Intent(显式与隐式)

    显式Intent就是在创建一个Intent的时候,显式注明要启动的Activity是哪一个:

    Intent i=new Intent(MainActivity.this,BActivity.class);
    

      第二个参数就是显式注明,我要启动的Activity就是显式注明的BActivity。

    隐式Activity就是在AndroidMainfest.xml中注册Activity的时候,指明Intent是通过Intent-filter进行的:

        <activity android:name=".MyAty">
                <intent-filter>
                    <!--default的行为方式是一个Activity-->
                    <category android:name="android.intent.category.DEFAULT"/>
                    <action android:name="info.baitian.learnintent.intent.aciton.MyAty"/>
                </intent-filter>
         </activity>
    

      在要跳转到MyAty这个Activity的时候,可以这样:

        findViewById(R.id.startMyAty).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                        startActivity(new Intent("info.baitian.learnintent.intent.aciton.MyAty"));
                }
            });
    

      上面这段代码是在我的另一个非MyAty的Activity中有一个id为startMyAty的Button,点击它可以利用Intent到我的MyAty。注:中间的“info.baitian.learnintent.intent.aciton.MyAty”可以是任意字符,只是约定这么写而已。

    当然,最好是把上面的字符在我的MyAty.java中创建一个常量ACTION:

    public static final String="info.baitian.learnintent.intent.aciton.MyAty";
    

      这样,Intent就可以这样创建了:

    startActivity(new Intent(MyAty.ACTION));
    

      通过隐式Intent可以跨应用(app)来启动Activity的,但是要是不允许别的app来应用的需要这样:

    <activity android:name=".MyAty" android:exported="false">
                <intent-filter>
                    <!--default的行为方式是一个Activity-->
                    <category android:name="android.intent.category.DEFAULT"/>
                    <action android:name="info.baitian.learnintent.intent.aciton.MyAty"/>
                </intent-filter>
            </activity>
    

      用exported="false"就行了。

    8、context是用来访问全局信息的接口。一些常用的组件就会继承自Context,方便调用访问:

        private TextView tv;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //这里的tv有访问res的能力,就好像具备了layout的性质。
            // 我们知道MainActivity也是继承了Context的。而有了Context就有了访问res的能力。
            tv=new TextView(MainActivity.this);
            tv.setText("HelloAndroid!");
    
            //不用layout的布局,而是自己创建了一个TextView tv
            //setContentView(R.layout.activity_main);
            setContentView(tv);
        }
    

      也可以用作实现多个组件之间的信息的共享与桥梁。

    9、Application,才是真正的全局上下文对象。

    10、程序的Activity的入口:

            <activity android:name=".Main2">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>    
    

      注意他的Intent-filter的name是这个就是程序的入口。

     11、好几个对象:Application与Activity

    12、service的使用、绑定与生命周期

    exported:是否向外部公开。

    启动一个service与启动一个Activity几乎是一模一样的:

    findViewById(R.id.btnStartService).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    startService(new Intent(MainActivity.this,MyService.class))
                }
            });
    

      用startService()函数,而启动一个Activity的用startActivity()函数。

    关闭一个ServicestopService()

     stopService(new Intent(MainActivity.this,MyService.class));
    

      不用担心new出来的Intent是不是操作的同一个Service实例。注意:Service实例只能被创建一次。

    13、onStartCommand()只要启动一次服务就运行一次,而onStart()不管你启动多少次服务(当然你没有stopService),它只是在第一次启动服务的时候跑一次。

    14、Service通信需要用Intent,当然这是在同一个Service。

    要是在不同的Service之间进行数据的传输该怎么办?也能像Activity之间通过Intent-filter的action进行信息的传递吗?答:在Android5.0之前是可以的,但是在Android5.0之后是不可以的。

    15、Android的权限。用WebView:

    在布局里面创建了一个WebView之后,在他的Activity的java中:

    private WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);//要注意这里的setContentView()是放在这儿的,不要放到最后
    webView= (WebView) findViewById(R.id.wv);
    webView.loadUrl("http://www.baitian.info");

    }

      这样是不能登录我的URL的,因为没有开通这个程序访问互联网的方法。

    <uses-permission android:name="android.permission.INTERNET"/>
    

      这样就可以登录了。

    15、fragment的生命周期

    onCreate()、onCreateView()、onPause()是重要的。

    16、Intent是组件之间重要的信使

    Intent实现Activity之间的跳转主要有两种方式:

    无返回结果的跳转:用startActivity(intent)

    有返回结果的跳转:startActivityForResult(intent,requestCode),这个还会用到另外两个函数onActivityResult(int requestCode,int resultCode,Int data),setResult(resultCode,data)

    17、组件的学习:

    改变view的透明度用函数setAlpha(float f)设置。

    创建事件的方法有三种:一、匿名内部类;二、外部类;三、implements OnClickListener...实现事件接口

    在布局中用gravity表示位置属性;布局的子类控件用layout_gravity表示位置属性;还有weight表示权重的属性。另外:布局可以套用

    18、添加构造函数(自动添加代码快捷键):

    Alt+Insert,选择要添加的内容,是构造函数还是getter+setter

    19、签名打包

    20、处于最外层的layout_width和layout_height是没有作用的

    21、Activity与View(Layout),以及MVC

    M Model, V View, C Control,在Android里面View就是 View 类, Control之一就是Activity 类了
    首先View不代表一个屏幕,View可以代表一个按钮(ButtonView),一行字(TextView),一个文本框(EditText),也可以代表一个不可见的容器(ViewGroup的子类们),装了一打按钮之类的东西,ViewGroup可以它里面东西的排列显示方式,横着、竖着、可以滚动的,等等,随心所欲。ViewGroup里面可以套ViewGroup,就像俄罗斯套娃,最外面那个才充满整个屏幕。
    Acitivity当然代表一个屏幕,但和view的作用不同。看View,不说别的,就onDraw()方法,Activity有吗?Activity连个带draw字的方法都没有,所以它不直接负责显示工作。你看Activity的方法,大部分都处理这些事的,比如触摸、按件、呼出菜单、保存状态、暂停、继续,都是处理程序的。如果你不给Acitvity里面“setContentView",它就没有东西显示。所以Activity就像是个后台打杂的,和前台唱戏的View是互相配合的关系。

    22、view的事件传递,图参考

    view不处理TouchEvent的流程:

    view-ignore-touch-event-example

    view处理事件的流程:

    view-process-touch-event-example

    23、view的绘制技术

    view_draw_method_chain img

    measure(int,int)→layout(int,int,int,int)→draw()

    measure测出大小,layout测出布局改怎么放,draw()就是画出来。requestLayout()是用户调用,这个过程没有draw()。参考

    -----------问题----------

    1、Application与Activity之间的关系

    2、安装都是安装的Activity的吗?

    3、Service的绑定与解绑

  • 相关阅读:
    django 日志窜打问题
    获取f5 应用并发数情况返回JSON
    埋在 MySQL 数据库应用中的17个关键问题!
    python 模拟发送JSON数据
    python 模拟 curx -u
    分区表和全局索引
    Oracle 普通表转分区表
    阿里云吕漫漪:深度解析国内首个云原生数据库POLARDB的“王者荣耀”
    哪些顾虑会影响企业采用云桌面?
    哪些顾虑会影响企业采用云桌面?
  • 原文地址:https://www.cnblogs.com/chenbuer/p/4762079.html
Copyright © 2020-2023  润新知