zoukankan      html  css  js  c++  java
  • android开发3:四大基本组件的介绍与生命周期

    android开发3:四大基本组件的介绍与生命周期

    Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器,。

    生命周期

    是指进程周期 – 创建到结束的过程

    进程类别

    前台进程:当前正在前台运行的进程
    可见进程:显示在前台中,但用户并未在和其进行交互
    服务进程:为用户提供服务的进程
    后台进程
    空进程:该进程一般是为了缓存机制而存在的
     

    组件介绍

    Activity(表现层)

    应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。
    Activity利用View来实现应用中的GUI(用户直接通过GUI和应用程序 做交互)。Activity窗口内的可见内容通过基类View提供。使用Activity.setContentView()方法设置当前 Activity中的View对象。 
    每个View对象控制着窗口内的一个矩形空间; 
    View是一种层次化结构,Parent View中的布局属性会被子View继承; 
    位于View层次关系最底层的子View对象所代表的矩形空间就是跟用户进行交互的地方 
    Activity的生命状态依次为: 
    onCreate 
    onStart 
    onRestart 
    onResume 
    onPause 
    onStop 
    onDestroy 
    =================================================================
    如果要保存页面中一些数据的话,要在onPause()中保存,在onResume()中读取。
    在 android 中,Activity 的生命周期交给系统统一管理。
    =================================================================
    Activity共有四种加载模式:
    1. standard
            模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。
    2. singleTop
            如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中
             已经存在该Activity实例,只要不在栈顶,都会创建实例)。
    3. singleTask
            如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到
            栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。 
    4. singleInstance
            在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实
    例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,
    不管谁激活该Activity都会进入同一个应用中。
     

    自定义View在Activity中的显示步骤:

    1、新建类,并集成自View类
    2、重写View中的绘制方法onDraw()
    3、新建类,集成自Activity类
    4、重写onCreate(),初始化自定义的View,然后将用户界面设置成此View对象
    吐槽1:啃爹的百度视频教程,教程里面演示运行一切Ok,我本地试了N此,用模拟器运行到时候总是提示Unfortunately,Activity has stopped。
    最终google找到问题:没有new Paint()
    此例没有使用XML布局,XML目录百度吧,很多,基本大同小异。后续在更新
    新建MyView类继承View类:
    package com.example.lesson1_helloandroid;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.view.View;
    /** 
     * 这个是自定义的MyView. 
     * 至少需要重载构造方法和onDraw方法 
     * 对于自定义的View如果没有自己独特的属性,可以直接在xml文件中使用就可以了 
     * 如果含有自己独特的属性,那么就需要在构造函数中获取属性文件attrs.xml中自定义属性的名称 
     * 并根据需要设定默认值,放在在xml文件中没有定义。 
     * 如果使用自定义属性,那么在应用xml文件中需要加上新的schemas, 
     * 比如这里是xmlns:my="http://schemas.android.com/apk/res/demo.view.my" 
     * 其中xmlns后的“my”是自定义的属性的前缀,res后的是我们自定义View所在的包 
     * @author Administrator 
     * 
     */  
    public class MyView extends View{
    	//设置画笔
    	Paint paint;
    	//构造函数
    	public MyView(Context context) {
    		super(context);
    		// TODO Auto-generated constructor stub
    		paint = new Paint(); 
    		//设置颜色 字体大小 等
    		paint.setColor(Color.WHITE);
    		paint.setTextSize(20);
    		paint.setAntiAlias(true);
    	}
    	
    	protected void onDraw(Canvas canvas){
    		//自定义界面绘制一个矩形框,在矩形框绘制一段文字
    		super.onDraw(canvas);
    		//定义画布背景颜色
    		canvas.drawColor(Color.BLUE);
    		//画布上绘制矩形框
    		canvas.drawRect(10,10,110,110, paint);
    		//在矩形框上通过画笔绘制了文字
    		canvas.drawText("你妹的屌丝", 60, 170, paint);
    	}
    }
    

    ===================================================通过xml布局显示(未测试,不过思路大致是这样)======================================

    相应的属性文件:
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    	<declare-styleable name="MyView">
    		<attr name="textColor" format="color"/>
    		<attr name="textSize" format="dimension"/>
    	</declare-styleable>
    </resources>

    在布局文件中使用:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    			  xmlns:my="http://schemas.android.com/apk/res/demo.view.my" 
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    	
        <demo.view.my.MyView
        	android:layout_width="fill_parent"
        	android:layout_height="wrap_content" 
        	my:textColor="#FFFFFFFF" 
        	my:textSize="22dp"
        	/>
    </LinearLayout>
    
    =============================================================================================================
     

    Activity类:

    package com.example.lesson1_helloandroid;//表示的是这个包的名称
    
    import android.os.Bundle;
    import android.app.Activity;//是一个活动包,每一个android活动都需要继承Activity类
    import android.view.Menu;//
    
    public class Lesson1_HelloAndroid extends Activity {
    
    	@Override 
    	//onCreate 是一个重载函数,在这个函数中实现应用程序创建的所执行的过程。
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		//设置当前的视图(View)
    		//设置的方法是使用一个文件,这个文件因此决定了视图中包含的内容。
    		//当前设置表示从res/layout/目录中使用activity_lesson1_hello_android.xml文件
    		//setContentView(R.layout.activity_lesson1__hello_android);
    		MyView myview = new MyView(this);
    		this.setContentView(myview);
    	}
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.lesson1__hello_android, menu);
    		return true;
    	}
    
    }
    

    AndroidManifest.xml(注:好像给不给权限都可以运行,默认就可以了,俺是因为一直报错就加了权限。。。。不过最终问题还是因为啃爹的录视频没有new Paint())

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.test"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="18"
            android:targetSdkVersion="18" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.example.test.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>

    运行结果:

     

    Service服务(较长生命周期但没有用户界面的程序):

     

    启动一个新的服务,或者向一个已有的服务传递新的指令,可以调用如下两种方法:

    1.Context.startService()
    2.Context.bindService()

    Broadcast Receiver服务

    发送广播Intent(所有已注册的拥有与之相匹配IntenFilter的BroadcastReceiv就会被激活),可以调用如下三种方法:

    1.Context.sendBroadcast()

    2.Context.sendOrderBroadcast()

    3.Context.sendStickBroadcast()

    Intent一旦发出,Android都会准 确找到相匹配的一个或多个Activity、Service或BroadcastReceiver作响 应。所以,不同类型的Intent消息不会出现重叠,BroadcastIntent消息只会发送给BroadcastReceiver,而绝不可能发送 给Activity或Server。有startActivity()传递的消息也只可能发送给Activity,由startService()传递的 Intent只可能发送给Service。

     
     
    待续…..
     
    http://mobile1.riaos.com/?p=2027820
  • 相关阅读:
    负载均衡--hash slot算法
    redis cluster slots数量 为何是16384(2的14次方)
    ZooKeeper原理与它的集群工作流程
    5分钟入门chrony
    微服务的下一步,离不开服务网格
    sar统计日流量与实时流量
    docker查看jvm内存占用
    k8s编排
    Rsync 排除文件
    Kubernetes 中优雅停机和零宕机部署
  • 原文地址:https://www.cnblogs.com/daishuguang/p/3867681.html
Copyright © 2011-2022 走看看