zoukankan      html  css  js  c++  java
  • android四大组件学习总结以及各个组件示例(1)

    android四大组件分别为activity、service、content provider、broadcast receiver。
    一、android四大组件详解
    1、activity
    (1)一个Activity通常就是一个单独的屏幕(窗口)。
    (2)Activity之间通过Intent进行通信。
    (3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。
    (4)Activity生命周期
    >什么是生命周期?
    对象从创建到销毁的阶段,必须会执行的方法,这些方法就是生命周期的回调
    Activity的7个方法以及作用:
    * oncreate()  activity被创建的时候调用的方法
    > ui界面的初始化 setContentView()
    * onDestroy() activity被销毁的时候调用的方法
    > 界面退出之前的扫尾操作,短信发送器,退出前数据的保存。
    * onStart() activity的界面用户可见
    > 更新ui的操作,播放视频
    * onStop() activity的界面用户不再可见
    > 界面不可见,暂停视频播放
    * onResume()
    > 界面获取到了焦点,按钮可以相应点击事件
    * onPause()
    > 界面失去了焦点,按钮就不可以相应点击事件
    * onRestart()
    >activity被最小化了,并没有销毁,如果下次再去打开这个activity
    >重新用户界面可见
    Activity的生命周期:
    ###完整生命周期(entire lifetime)
    onCreate-->onStart-->onResume-->onPause-->onStop-->onDestory
    ###可视生命周期(visible lifetime)
    onStart-->onResume-->onPause-->onStop
    ###前台生命周期(foreground lifetime)
    onResume-->onPause
     
    以一个打怪的小游戏实现Activity的七种方法为例:
    1.首先建立一个项目工程文件:这个项目工程要实现三个作用:演示Activty的七种方法、背景透明、锁定横竖屏;
    2.首先配置打怪的页面布局文件如下:
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    	android:orientation="vertical" >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我是main界面" />
        <Button 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="启动second界面"
            android:onClick="click"
            />
        <Button 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="打怪"
            android:onClick="click1"
            />
        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="100" />
    </LinearLayout>
    

     3.然后就是配置MainActivity.java

    package com.xunfang.activity;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    	
    	private TextView tv ;	
    	private int blood = 100 ; 
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		System.out.println("界面被创建了");
    		//finish() ;
    		//拿到怪物的血槽
    		tv = (TextView) findViewById(R.id.tv) ;
    	}
    	
    	@Override
    	protected void onStart() {
    		super.onStart();
    		System.out.println("界面可以看到了");
    	}
    	
    	@Override
    	protected void onResume() {
    		super.onResume();
    		System.out.println("我获得焦点了");
    	}
    	
    	@Override
    	protected void onRestart() {
    		super.onRestart();
    		System.out.println("用户重启界面了");
    	}
    	
    	@Override
    	protected void onPause() {
    		super.onPause();
    		System.out.println("我失去焦点了");
    	}
    	
    	@Override
    	protected void onStop() {
    		super.onStop();
    		System.out.println("界面看不见了");
    	}
    	@Override
    	protected void onDestroy() {
    		super.onDestroy();
    		System.out.println("界面被销毁了");
    	}
    	public void click(View view){
    		Intent intent = new Intent(this,SecondActivity.class) ;
    		startActivity(intent) ;
    	}
    	
    	public void click1(View view){
    		//每点击一次,让怪物的血下降爱6点
    		blood -= 6 ;
    		//将血设回到怪物身上
    		tv.setText(blood + "") ;
    	}
    }
    

     3.配置AndroidManifest.xml,其中让系统的环境不在去敏感横竖屏的切换,代码是android:configChanges="orientation|screenSize|keyboardHidden"透明界面代码如下:android:theme="@android:style/Theme.Translucent", 如果想要设置apk的图标,就要这样调用设置,我调用的是系统的图标:android:icon="@android:drawable/arrow_up_float"具体代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.xunfang.activity"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="14"
            android:targetSdkVersion="16" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" > 
            <activity
                android:name=".MainActivity"
                android:icon="@android:drawable/arrow_up_float"
                android:label="我是主界面" 
                android:configChanges="orientation|keyboardHidden|screenSize"
                android:theme="@android:style/Theme.Translucent"
                >
                <!-- 透明界面 Translucent:透明 
                	android:theme="@android:style/Theme.Translucent"
                -->
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name="com.xunfang.activity.SecondActivity" >
            </activity>
        </application>
    
    </manifest>
    

     4.Second.xml与SecondActivity.java全部是系统默认生成的,不用去改动,然后可以直接测试去看效果怎么样了。

     
     
     
    2.content provider

     android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式,

    整体思路:

    ##对文件的内容提供者
    1. 有一个应用程序,带一个私有的文件,需求是暴露这个私有的文件。
    2. 写ContentProvider的一个子类
    3. 定义匹配规则
        *  定义匹配器 UriMatcher
        *  定义匹配规则 mUriMatcher.addURI("com.xunfang.content", "文件名", SUCCESS);
    4. 重写openFile方法
    5. 在清单文件中声明内容提供者节
    <provider
                android:name="com.xunfang.provider.DBProvider"
                android:authorities="com.xunfang.sql"
      ></provider>

    下面就通过保存数据的例子来讲解:

    1.新建项目,如下图所示

    2.配置MainActivity.java,如下所示:

    package com.xunfang.openfile;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    
    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    
    public class MainActivity extends Activity {
    	private EditText name;
    	private Button save;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initview();
            setLister();
        }
    
    	private void initview() {
    		name = (EditText) findViewById(R.id.et_name);
    		save = (Button) findViewById(R.id.btn_save);
    	}
    
    	private void setLister() {
    		save.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				String uname = name.getText().toString().trim();
    				String path = getFilesDir()+"/private.txt";
    				try {
    					FileOutputStream fos = new FileOutputStream(path);
    					fos.write(uname.getBytes());
    					fos.close();
    					Toast.makeText(getApplicationContext(), "保存成功", 0).show();
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    
    }
    

     FileProvider.java配置如下:

    package com.xunfang.FileProvider;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    
    import android.content.ContentProvider;
    import android.content.ContentValues;
    import android.content.UriMatcher;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.ParcelFileDescriptor;
    
    public class FileProvider extends ContentProvider {
    	private static final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    	private static final int SUCCESS = 1;
    	static{
    		matcher.addURI("com.xunfang.openfile", "private.txt", SUCCESS);
    	}
    
    	@Override
    	public boolean onCreate() {
    		return false;
    	}
    
    	@Override
    	public Cursor query(Uri uri, String[] projection, String selection,
    			String[] selectionArgs, String sortOrder) {
    		return null;
    	}
    
    	@Override
    	public String getType(Uri uri) {
    		return null;
    	}
    
    	@Override
    	public Uri insert(Uri uri, ContentValues values) {
    		return null;
    	}
    
    	@Override
    	public int delete(Uri uri, String selection, String[] selectionArgs) {
    		return 0;
    	}
    
    	@Override
    	public int update(Uri uri, ContentValues values, String selection,
    			String[] selectionArgs) {
    		return 0;
    	}
    	
    	@Override
    	public ParcelFileDescriptor openFile(Uri uri, String mode)
    			throws FileNotFoundException {
    		if(matcher.match(uri) == SUCCESS){
    			File file = new File(getContext().getFilesDir(), uri.getPath());
    			return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
    		}else{
    			return super.openFile(uri, mode);
    		}
    	}
    
    }
    

     最后在AndroidMainfest.xml中

     

     就可以了。

    service、broadcast receiver两个组件将在下篇博文仔细讲解!

  • 相关阅读:
    C#几个经常犯错误汇总
    vs2010密钥
    SQL数据库基础知识用sql语句创建数据库
    空值显示表格线条(border)
    vs2008常用快捷方式
    汉字与十六进制之间的相互转换
    asp.net中常用信息验证总结
    GridView中全选和反选
    Nonreentrant C# timer
    GC.Collect
  • 原文地址:https://www.cnblogs.com/ouysq/p/4643900.html
Copyright © 2011-2022 走看看