Activity学习日记(三)

                                Activity学习日记(三)

 

四大组件之
        Activity的生命周期,启动
        Intent
        Service的生命周期,两种编程方式
        BroadcastReceiver
--------------------------------------------------------------------------------
什么是Activity    
        a,布满整个窗口或者悬浮于其他窗口上的交互界面
        b,一个应用程序中通常有一个或多个Activity构成
        b,每个Activity都必须在AndroidManifest.xml中进行申明
        c,多个Activity是通过栈进行管理,当前的活动的Activity在栈顶
        d,在程序中自定义的Activity必须继承基类Activity
        c,Activity有自己的生命周期,并且在不同的生命周期中会调用不同的函数
    创建方法:
        1.定义一个Activity的子类
        2.重写onCreate()
        3.定义一个布局视图    
        4.将布局视图关联给活动
        5.注册活动子类到清单文件
    四大组件之Activity的生命周期
        class 人类{
            出生方法(){}
            
            上幼儿方法(){}
            
            上小学(){}
            
            上中学(){}
            
            上大学(){}
            
            工作1(){}
            工作2(){}
            
            找对象(){}
            成家(){}
            
            去世(){}
            
        }

        onCreate():  Activity开始被创建的时候被调用,
                        主要完成的任务:创建ui视图,绑定数据到list中

        onStart():  当Activity变成可视化的时候被调用,可见了,但还不是可交互的
                        从后台切换到前台也会调用
                       此方法中可以去维护一些显示在Activity上的资源,比如可以注册一个BroadcastReceiver,用于监控对UI产生影响的状态变化
                       比如ui上的内容发生变化,可以通过个BroadcastReceiver去广播
                       

        onResume:获取到与用户交互的焦点,也可以认为是apk正在running
                在这里可以做一些动画的播放,打开独占设备(比如相机)
        onPause: 失去用户交互的焦点,但是视图还在,比如另外一个Activity切换到前台并获取到焦点时(一个对话框出现,或者是休眠)
                    在这个方法中执行停止动画等比较耗CPU的操作,或者将需要永久化存储的数据进行保存,因为有可能不会回来了
                    onResume和onPause会经常切换,所以里面的内容尽量的是轻量级的,以避免导致用户等待
        onStop:表示当前Activity完全被其他的视图给占用了

        onDestrory: 整个Activity完全销毁的时候,该方法中应该完成释放资源的操作

        3个阶段和7个方法
            开始阶段:onCreate, onStart, onResume
            重新获取焦点: onRestart(); onStart();onResume;
            关闭Activity: onPause, onStop,onDestory

        Activity获得与失去焦点的循环:
            onPause->onResume->onPause
        Activity可见与不可见的循环
            onStart->onRestart->onResume->onPause->onStop

        整个生命周期:onCreate-->onDestory
            可视周期:
                onStart->onStop
            焦点周期:
                onResume->onPause
            在 activity 被停止后重新启动时(调用打开过的应用程序)调用该方法。其后续会调用 onStart 方法    
                onRestart()
        总共7个
        -------------------------------------------------
        activity创建(onCreate)->可视化(onStart)->获取焦点(onResume)
                |
                来了一个电话
        onPause(失去焦点)->onStop(失去视图)
                |
                接完电话,返回到app
        onRestart(重新开始,针对恢复activity)->onStart(可视化)->onResum(获取焦点)
                |
                退出activity
        onPause(失去焦点)->onStop(失去视图)->onDestroy(毁灭)
        
        按下返回按键:onPause()->onStop()->onDestory()
        长按Home键,弹出最近打开过的应用程序
        按Home键:onPause()->onStop()
        onRestart():启动一个另外一个Activity后,由另外一个Activity返回时
===============================================================================    
    启动Activity的方式:
    1,startActivity();
        a,启动一个自定义的Activity(显示的启动)
            Intent intent = new Intent();                           //创建一个Intent对象   
            intent.setClass(activity1.this, activity2.class);   //描述起点和目标   
            startActivity(intent);                                     //开始跳转
        b,启动系统的Activity
            String telString = "tel://13800138000";
            final Uri telUri = Uri.parse(telString);
            Intent intent = new Intent(Intent.ACTION_DIAL, telUri);
            
            String data = "http://www.google.com";
            final Uri webUri = Uri.parse(data);
            Intent intent = new Intent(Intent.ACTION_VIEW, webUri);
            startActivity(intent);
        
        
    2,启动另外一个Activity并返回结果--实质也是通过Bundle实现
        startActivityForResult(Intent, int requestCode);---------->    
            参数2:requestCode请求码,由程序员自行定义,用于标识请求来源
                    例如:一个Activity有两个按钮,点击这两个按钮会打开不同的Activity
                    不管哪个Activity关闭后,系统都会调用前面Activity的onActivityResult()
                    如果需要获取不同的Activity返回来的数据,那么可以通过该请求码进行识别
        onActivityResult(int requestCode, int resultCode, Intent)<---------------------setResult(Int resultCode);
            requestCode:用于区分到底是哪个请求
            resultCode: 结果码
            Intent:包含Bundle,里面有跟多信息
        另外一个:
           Intent data=new Intent();  
            data.putExtra("bookname", str_bookname);  
            data.putExtra("booksale", str_booksale);  
                setResult(20, data); // 

    3,启动activity的时候传递数据: intent作为中介(也可以理解为容器)
        a,携带Bundle
            1,构建Bundle
            2,填入数据
                bundle.putInt("键", 值); //普通数据
                budle.putSerialize("键",对象);
            3,将Bundle加入到Intent
                putExtra(Bundle) 
                
        b,键值对
            putExtra("键", 值);
        c,获取数据
            Intent intent = getIntent();
    关闭Activity:
        a,关闭当前的activity
            finish();
        b,关闭以startActivityForResult()方法启动的Activity
            finishActivity(int requestCode);

========================================================================
intent的作用和使用
    什么是intent?
    a,为一个信息的载体,用于应用间的交互与通讯,对应用中一次操作的动作、动作涉及数据、附加数据进行
        描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成
        组件的调用
    b,Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互
        比如启动另外一个Activity,另外一个Service,还可以发送广播给BoardcastReciver
        
    c,intent的属性--表示要做什么,带了一些什么信息
        Intent主要有以下四个重要属性,它们分别为:
        0,Component name:表示该intent是交给哪个具体的Component组件的(该对象是可选的,同时也可以不用intent-filter)
            在代码中需要如下操作:
                ComponentName comp = new ComponentName(xxx类.this, 另一个Activity的this);
                Intent  intent = new Intent();
                intent.setComponent(comp);
                StartActivity(Intent);
        
        Action 和Category,在启动的组件中需要有intent-filter
        1,Action:值为一个字符串,它代表了系统中已经定义了一系列常用的动作
            a,系统自带的常量:ACTION_CALL,ACTION_EDIT
            b,自定义的字符串,一般格式:"包名.类名.特定的字符"
        
        2,Category:组件的类别,用于描述哪一类的组件可以处理该Intent,也是一个字符串,为Action添加的附加信息,通常会和Action结合使用
            一个Intent只能指定一个Action,但可以指定多个Category
                    CATEGORY_DEFAULT :默认的category
                    CATEGORY_LAUNCHER:决定应用程序是否显示在程序列表里,表示在luncher中可否启动该组件
                    CATEGORY_BROWSABLE :在网页上点击图片或链接时,系统会考虑将此目标Activity列入可选列表,
                                    供用户选择以打开图片或链接。比如有个网页链接,你的系统装了很多浏览器,此时会列举出多个打开方式
                    
            
        以上一般比较重要的是:
            action 
            category

    Intent被解析的过程:显示intent和隐式intent
        显示intent:明确指定需要启动或者触发的组件的类名,常用于启动当前应用程序的不同组件
                类似与找人: 找章子怡
        隐式intent:指定需要启动或者触发的组件应满足怎样的条件,常用于启动其他应用程序中的组件
                也就是说系统会对intent进行解析,解析出它的条件
                然后再在系统中查找与之匹配的目标组件
                而被调用或目标组件需要通过intentfilter来声明自己满足条件
                类似与找人: 穿红衣服的女孩
    Intent-filter:组件的意图过滤器,
        a,其实是一个对象,但是一般不会直接去创建,都是在AndroidManifest.xml中存在
        b,一个组件中可以有多个Intent-filter,可以根据过滤不同的intent而采取不同的处理
        c,过滤的时候会过滤三个域:action,data,category,任何intent必须成功经过这三道过滤,缺一不可
        Action test:至少有一个
            <intent-filter . . . >
                <action android:name="com.example.project.SHOW_CURRENT" />
                <action android:name="com.example.project.SHOW_RECENT" />
                <action android:name="com.example.project.SHOW_PENDING" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            必须添加一个android.intent.category.DEFAULT


        c,隐式的启动:
            在intent添加过滤器intentfilter
            <activity  <!--被启动的Activity -->
                android:name="com.example.android.tst.SecondActivity"
                android:label="@string/title_activity_main" > 
                <intent-filter> 
                <action android:name="com.example.android.tst.SecondActivity"/> 
                <category android:name="android.intent.category.DEFAULT" /> 
                </intent-filter> 
            </activity>

            启动方法:
                Intent intent=new Intent("com.example.android.tst.SecondActivity");
                //或者如下操作
                //intent.setAction( "com.example.android.tst.SecondActivity");
                //intent.addCategory(Intent.CATEGORY_DEFAULT);
                startActivity(intent);
                解释:
                发送了这个intent之后,android会去系统里保存的MainManifest.xml里查找符
                合这两个属性的activity,

                任何一个需要隐式启动的Activity都必须要有这项:
                    <category android:name="android.intent.category.DEFAULT"/>
==========================================================================
Service在Android中和Activity是属于同一级别上的组件
            Activity仪表不凡,迷倒万千少女
            Service身强力壮,但是在后台做一些搬运工的力气活

            后台运行
Service的特性:
            1, 拥有后台运行的特性,比如将屏幕关闭后,继续运行
            2,不是一个独立的进程,除非特别指定(存在于一个进程中)
            3,它不是一个线程
            4,服务是一种    应用程告诉系统它想在后台要做的某个事情    的工具,并将功能提供(暴露)给其它应用程序

Service的应用场合:
        从播放列表播放音乐,播放器有一些activities来叫用户选定歌曲并开始播放。但是,播放本身不需要activity处理,因为用户希望关闭activity
        后歌曲会继续播放。因此media player 的activity 会启动一个service


Service的两种启动方式:
            context.startService()-- 对应于Local Service(本地服务,调用和实现在同一个进程)
                        依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC
                        主进程被Kill后,服务便会终止。
            context.bindService()-- 对应于Remote Service(远程服务,调用和实现不在同一个进程)
                        由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程
                        提供服务具有较高的灵活性。该服务是独立的进程,会占用一定资源,并且使用AIDL进行IPC稍微麻烦一点
    
Service的生命周期:
        本地服务:
                启动一个Service的过程
                            context.startService() ->onCreate()->onStartCommand()->Servicerunning
                
                            startService()在Activity中启动服务,实际是并实例化了一个Service实例
                            onCreate()    进行一些服务的初始化工作,比如可以创建一个线程用于播放音乐
                            onStartCommand():服务正常运行时,能够处理Intent,如果多多次启动服务,该方法会被调用
                                                在以前的版本该方法为onStart();onStartCommand()内部会被调用,已经过时了
                
                停止一个Service的过程:
                            context.stopService() ->onDestroy() ->Service stop 
                            
                            Activity调用这即使结束了自己的生命周期,只要没有使用stopService方法停止这个服务,服务仍会运行
        远程服务: 远程服务其实就是给外部apk提供各种接口
                启动一个Service的过程
                        context.bindService()-->onCreate()-->onBind()-->Servicerunning

                                onBind():当绑定成功时,该方法被调用,并且需要返回一个binder接口的实例
                                        如果重复绑定,该方法只会执行一次
                停止一个Service的过程:
                        context.unbindService()-->onUnBinde()-->onDestroy()-->Service stop 
                        
                        bindService模式下服务是与调用者生死与共的,在绑定结束之后,一旦调用者被销毁,服务也就立即终止,
                        就像江湖上的一句话:不求同生,但愿同死,当然罗,如果要继续用服务,再bind就好了, 服务会跟着运行起来的

MediaPlayer media;
media = MediaPlayer.create(MyService.this,R.raw.nobody);
media.start();
media.stop();
------------------------------------------------------------------------------------------------------------------------------------
BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播
    广播体现在方方面面,例如
            当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;
            当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;
            当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。

广播的发送:
    普通广播:
            对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,
            接收者无法终止广播,    即无法阻止其他接收者的接收动作。
            sendBroadcast(intent);
            sendOrderBroadcast(intent);
            abortBroadcast();
    有序广播:
        它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播
        sendOrderedBroadcast(intent, "george.permission.MY_BROADCAST_PERMISSION");
                参数中有个权限,所以
                        在AndroidMainfest.xml中定义一个权限:
                            <permission android:protectionLevel="normal"
                                            android:name="george.permission.MY_BROADCAST_PERMISSION" />
                        
                        如果要发送广播,必须要获取到这个权限:
                            <uses-permission android:name="george.permission.MY_BROADCAST_PERMISSION" />

过滤器的配置:
        1,静态:在AndroidManifest.xml文件中配置,这种方式的注册是常驻型的,也就是说当应用关闭后,
                        如果有广播信息传来,MyBroadCastReceiver也会被系统调用而自动运行

                <receiver android:name="com.hq.component.broadcast.MyBroadCastReceiver" >
                    <intent-filter android:priority="999" >
                        <action android:name="broadcast.MyBroadCastReceiver" />

                        <category android:name="android.intent.category.DEFAULT" />
                    </intent-filter>
                </receiver>
        2,动态:在代码中动态的指定广播地址并注册,通常我们是在Activity或Service注册一个广播
                    不是常驻型的,也就是说广播会跟随程序的生命周期

                private ThirdBroadCastReceiver receiver = null;
                //新建一个广播接收器
                receiver = new ThirdBroadCastReceiver();
                //新建一个过滤器
                IntentFilter filter = new IntentFilter();
                filter.addAction("broadcast.MyBroadCastReceiver");
                filter.setPriority(997);
                //为广播接受器注册一个过滤器
                registerReceiver(receiver, filter);


广播的接收:
        普通广播:
                intent.getExtras();
        有序广播:
                接受
                    String extraStr = getResultExtras(true).getString("passMsg");
                继续传播:
                    // 给下个广播接受者传递广播
                    Bundle bundle = new Bundle();
                    bundle.putString("passMsg", intentStr + "from @SecondBroadCastReceiver");
                    setResultExtras(bundle);
                停止传播:
                    abortBroadcast();

  • 实现动态UI编程

 

package com.hq.myapp;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class LoginActivity extends Activity {
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//setContentView(R.layout.activity_login);
		
		
		LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, 
													LayoutParams.MATCH_PARENT);
		LinearLayout layout = new LinearLayout(this);
		layout.setOrientation(LinearLayout.VERTICAL);
		//需要设置宽度和高度
		layout.setLayoutParams(params);
		
		
		//新增一个textview
		TextView tv = new TextView(this);
		LayoutParams params2 = new LayoutParams(LayoutParams.WRAP_CONTENT, 
				LayoutParams.WRAP_CONTENT);
		tv.setLayoutParams(params2);
		tv.setText("大爷还是你大爷");	
		tv.setTextColor(Color.GREEN);
		tv.setTextSize(20.0f);
		
		Button btn = new Button(this);
		btn.setLayoutParams(params2);
		btn.setText(R.string.code_btn_text);
	
		
		layout.addView(tv);
		layout.addView(btn);
		
		setContentView(layout);
		
	}

	
}
  • 实现事件监听,自定义toast和对话框

 

package com.hq.myapp;

import java.io.LineNumberInputStream;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;


public class LoginActivity extends Activity {
	private final String TAG = "LoginActivity";
	Button  btn_login;
	Button  btn_exit;
	
	
	//必须有一个监听器
	OnClickListener btnClickListener = new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			Log.d(TAG, "点击了,666");
			
			//来个吐司--用于调试/提示
			//自定义一个吐司
			Toast t = Toast.makeText(LoginActivity.this, "自定义吐司", Toast.LENGTH_LONG);
			t.setGravity(Gravity.CENTER, 0, 0);
			LinearLayout layout = 	(LinearLayout) t.getView();  //得到一个view
			ImageView image = new ImageView(LoginActivity.this);
			image.setImageResource(R.drawable.head3);
			layout.addView(image);
			t.show();
		}
	}; 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		//其实该代码已经对xml中所有的标签进行分析,已经new所有控件
		setContentView(R.layout.activity_login);
		
		//获取到ui控件
		btn_login = (Button) findViewById(R.id.btn_login);
		
		//绑定事件源和监听器
		btn_login.setOnClickListener(btnClickListener);
		
		btn_exit = (Button) findViewById(R.id.btn_exit);
		btn_exit.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				// 先要创造建造工--创建dialog对象的对象
				AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
				//设置icon图标
				builder.setIcon(R.drawable.button_share);
				//设置标题栏
				builder.setTitle("退出对话框");
				// 设置消息体
				builder.setMessage("你真的那么忍心就退出吗");
				// 设置两个按钮
				builder.setNegativeButton("再玩会", null);
				builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						System.exit(1);
					}
				});
				//创造对话框
				builder.create().show();
				
			}
		});
	}

	
}

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/tv_user_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="18dp"
        android:layout_marginTop="34dp"
        android:text="用户名"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <EditText
        android:id="@+id/et_username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/tv_user_name"
        android:layout_alignBottom="@+id/tv_user_name"
      	android:layout_toRightOf="@id/tv_user_name"
        android:layout_marginLeft="30dp"
        android:ems="10"
        android:inputType="textPersonName" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/tv_passwd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tv_user_name"
        android:layout_below="@+id/tv_user_name"
        android:layout_marginTop="59dp"
        android:text="密  码"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <EditText
        android:id="@+id/et_passwd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/tv_passwd"
        android:layout_alignLeft="@+id/et_username"
        android:ems="10"
        android:inputType="textPassword" />

    <CheckBox
        android:id="@+id/cb_mark_pwd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tv_passwd"
        android:layout_centerVertical="true"
        android:text="记住密码" />

    <CheckBox
        android:id="@+id/cb_auto_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/cb_mark_pwd"
        android:layout_marginLeft="45dp"
        android:layout_toRightOf="@+id/cb_mark_pwd"
        android:text="自动登录" />

    <Button
        android:id="@+id/btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/cb_mark_pwd"
        android:layout_below="@+id/cb_mark_pwd"
        android:layout_marginTop="67dp"
        android:text="登录" />

    <Button
        android:id="@+id/btn_exit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/btn_login"
        android:layout_alignRight="@+id/et_username"
        android:layout_marginRight="16dp"
        android:text="退出" />

</RelativeLayout>

 

  • 实现密码登录和界面跳转
package com.hq.myapp;



import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;


public class LoginActivity extends Activity {
	private final String TAG = "LoginActivity";
	Button  btn_login;
	Button  btn_exit;
	EditText et_username;
	EditText et_passwd;
	
	
	void myToast()
	{
		//来个吐司--用于调试/提示
		//自定义一个吐司
		Toast t = Toast.makeText(LoginActivity.this, "自定义吐司", Toast.LENGTH_SHORT);
		t.setGravity(Gravity.CENTER, 0, 0);
		LinearLayout layout = 	(LinearLayout) t.getView();  //得到一个view
		ImageView image = new ImageView(LoginActivity.this);
		image.setImageResource(R.drawable.head3);
		layout.addView(image);
		t.show();
	}
	
	//必须有一个监听器
	OnClickListener btnClickListener = new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			Log.d(TAG, "点击了,666");
			
			// 1,获取两个输入框的内容
			String username = et_username.getText().toString().trim();
			String passwd = et_passwd.getText().toString().trim();
			// 2, 比对内容
			if(!username.isEmpty() && !passwd.isEmpty()){
				if(username.equals("root") && passwd.equals("123456")){
					myToast();
					// 3, 比对密码成功就进入另外一个界面xxx.class是所有类中一个程序,记录对应类的信息
					Intent  intent = new Intent(LoginActivity.this, RegiterActivity.class);
					intent.putExtra("price", 39);
					startActivity(intent);
					
				}else{
					Toast.makeText(LoginActivity.this, "用户或者密码错误", 1000).show();
				}
				
				
			}else{
				Toast.makeText(LoginActivity.this, "用户或者密码不能为空", 1000).show();
			}
			
			
			
			
		}
	}; 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		//其实该代码已经对xml中所有的标签进行分析,已经new所有控件
		setContentView(R.layout.activity_login);
		
		initUI();
		
	}
	private void initUI() {
		// TODO Auto-generated method stub
		
		et_passwd = (EditText) findViewById(R.id.et_passwd);
		et_username = (EditText) findViewById(R.id.et_username);
		
		//获取到ui控件
		btn_login = (Button) findViewById(R.id.btn_login);
		//绑定事件源和监听器
		btn_login.setOnClickListener(btnClickListener);
		
		btn_exit = (Button) findViewById(R.id.btn_exit);
		btn_exit.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				// 先要创造建造工--创建dialog对象的对象
				AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
				//设置icon图标
				builder.setIcon(R.drawable.button_share);
				//设置标题栏
				builder.setTitle("退出对话框");
				// 设置消息体
				builder.setMessage("你真的那么忍心就退出吗");
				// 设置两个按钮
				builder.setNegativeButton("再玩会", null);
				builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						System.exit(1);
					}
				});
				//创造对话框
				builder.create().show();
				
			}
		});
	}

	
}

 

package com.hq.myapp;



import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;


public class LoginActivity extends Activity {
	private final String TAG = "LoginActivity";
	Button  btn_login;
	Button  btn_exit;
	EditText et_username;
	EditText et_passwd;
	
	
	void myToast()
	{
		//来个吐司--用于调试/提示
		//自定义一个吐司
		Toast t = Toast.makeText(LoginActivity.this, "自定义吐司", Toast.LENGTH_SHORT);
		t.setGravity(Gravity.CENTER, 0, 0);
		LinearLayout layout = 	(LinearLayout) t.getView();  //得到一个view
		ImageView image = new ImageView(LoginActivity.this);
		image.setImageResource(R.drawable.head3);
		layout.addView(image);
		t.show();
	}
	
	//必须有一个监听器
	OnClickListener btnClickListener = new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			Log.d(TAG, "点击了,666");
			
			// 1,获取两个输入框的内容
			String username = et_username.getText().toString().trim();
			String passwd = et_passwd.getText().toString().trim();
			// 2, 比对内容
			if(!username.isEmpty() && !passwd.isEmpty()){
				if(username.equals("root") && passwd.equals("123456")){
					myToast();
					// 3, 比对密码成功就进入另外一个界面xxx.class是所有类中一个程序,记录对应类的信息
					Intent  intent = new Intent(LoginActivity.this, RegiterActivity.class);
					intent.putExtra("price", 39);
					startActivity(intent);
					
				}else{
					Toast.makeText(LoginActivity.this, "用户或者密码错误", 1000).show();
				}
				
				
			}else{
				Toast.makeText(LoginActivity.this, "用户或者密码不能为空", 1000).show();
			}
			
			
			
			
		}
	}; 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		//其实该代码已经对xml中所有的标签进行分析,已经new所有控件
		setContentView(R.layout.activity_login);
		
		initUI();
		
	}
	private void initUI() {
		// TODO Auto-generated method stub
		
		et_passwd = (EditText) findViewById(R.id.et_passwd);
		et_username = (EditText) findViewById(R.id.et_username);
		
		//获取到ui控件
		btn_login = (Button) findViewById(R.id.btn_login);
		//绑定事件源和监听器
		btn_login.setOnClickListener(btnClickListener);
		
		btn_exit = (Button) findViewById(R.id.btn_exit);
		btn_exit.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				// 先要创造建造工--创建dialog对象的对象
				AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
				//设置icon图标
				builder.setIcon(R.drawable.button_share);
				//设置标题栏
				builder.setTitle("退出对话框");
				// 设置消息体
				builder.setMessage("你真的那么忍心就退出吗");
				// 设置两个按钮
				builder.setNegativeButton("再玩会", null);
				builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						System.exit(1);
					}
				});
				//创造对话框
				builder.create().show();
				
			}
		});
	}

	
}

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/tv_user_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="18dp"
        android:layout_marginTop="34dp"
        android:text="用户名"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <EditText
        android:id="@+id/et_username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/tv_user_name"
        android:layout_alignBottom="@+id/tv_user_name"
      	android:layout_toRightOf="@id/tv_user_name"
        android:layout_marginLeft="30dp"
        android:ems="10"
        android:inputType="textPersonName" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/tv_passwd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tv_user_name"
        android:layout_below="@+id/tv_user_name"
        android:layout_marginTop="59dp"
        android:text="密  码"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <EditText
        android:id="@+id/et_passwd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/tv_passwd"
        android:layout_alignLeft="@+id/et_username"
        android:ems="10"
        android:inputType="textPassword" />

    <CheckBox
        android:id="@+id/cb_mark_pwd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tv_passwd"
        android:layout_centerVertical="true"
        android:text="记住密码" />

    <CheckBox
        android:id="@+id/cb_auto_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/cb_mark_pwd"
        android:layout_marginLeft="45dp"
        android:layout_toRightOf="@+id/cb_mark_pwd"
        android:text="自动登录" />

    <Button
        android:id="@+id/btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/cb_mark_pwd"
        android:layout_below="@+id/cb_mark_pwd"
        android:layout_marginTop="67dp"
        android:text="登录" />

    <Button
        android:id="@+id/btn_exit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/btn_login"
        android:layout_alignRight="@+id/et_username"
        android:layout_marginRight="16dp"
        android:text="退出" />

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <RatingBar
        android:id="@+id/ratingBar1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="86dp" />

</RelativeLayout>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值