android拦截短信并屏蔽系统的Notification

http://blog.csdn.net/wufenglong/archive/2011/03/07/6230310.aspx

 

1.android接收短信时是以广播的方式

 

2.程序只要在自己的Manifest.xml里加有”接收”SMS的权限

 

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

 

3.要写个广播接收类

public class smsreceiveandmask extends BroadcastReceiver {
	private String TAG = "smsreceiveandmask";
	@Override
	public void onReceive(Context context, Intent intent) {
		
	}

 

4.Manifest.xml的receiver标签里要加入intent-filter ,action为

<action android:name="android.provider.Telephony.SMS_RECEIVED" />

 

5.重要的是要在这个intent-filter上加上priority优先级,以使自己接收到SMS优先于系统或其它软件

<receiver android:name=".smsreceiveandmask" >
			<intent-filter android:priority="1000"> 
				<action android:name="android.provider.Telephony.SMS_RECEIVED" />
			</intent-filter>
		</receiver>

 

6.当自己的程序接收到要屏蔽的SMS后,用 this.abortBroadcast();来结束广播的继续发给别的程序,这样系统就不会收到短信广播了,Notification也不会有提示了

// 第三步:取消
if (flags_filter) {
	this.abortBroadcast();
}

 

源码如下:

Manifest.xml

< xml version="1.0" encoding="utf-8" >
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.hwttnet.test.smsreceiveandmask" android:versionCode="1"
	android:versionName="1.0">
	<uses-sdk android:minSdkVersion="3" />
	<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<receiver android:name=".smsreceiveandmask" >
			<intent-filter android:priority="1000"> 
				<action android:name="android.provider.Telephony.SMS_RECEIVED" />
			</intent-filter>
		</receiver>
	</application>
</manifest>

 

BroadcastReceiver类:

package com.hwttnet.test.smsreceiveandmask;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
public class smsreceiveandmask extends BroadcastReceiver {
	private String TAG = "smsreceiveandmask";
	@Override
	public void onReceive(Context context, Intent intent) {
		Log.v(TAG, ">>>>>>>onReceive start");
		// 第一步、获取短信的内容和发件人
		StringBuilder body = new StringBuilder();// 短信内容
		StringBuilder number = new StringBuilder();// 短信发件人
		Bundle bundle = intent.getExtras();
		if (bundle != null) {
			Object[] _pdus = (Object[]) bundle.get("pdus");
			SmsMessage[] message = new SmsMessage[_pdus.length];
			for (int i = 0; i < _pdus.length; i++) {
				message[i] = SmsMessage.createFromPdu((byte[]) _pdus[i]);
			}
			for (SmsMessage currentMessage : message) {
				body.append(currentMessage.getDisplayMessageBody());
				number.append(currentMessage.getDisplayOriginatingAddress());
			}
			String smsBody = body.toString();
			String smsNumber = number.toString();
			if (smsNumber.contains("+86")) {
				smsNumber = smsNumber.substring(3);
			}
			// 第二步:确认该短信内容是否满足过滤条件
			boolean flags_filter = false;
			if (smsNumber.equals("10086")) {// 屏蔽10086发来的短信
				flags_filter = true;
				Log.v(TAG, "sms_number.equals(10086)");
			}
			// 第三步:取消
			if (flags_filter) {
				this.abortBroadcast();
			}
		}
		Log.v(TAG, ">>>>>>>onReceive end");
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ImageButton的焦点和事件处理

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
/**
 * ImageButton的焦点和事件处理
 *
 */
public class ActivityMain extends Activity {
	private ImageButton myImageButton ;
	private Button myButton;
	private TextView myTextView;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //创建三个组件
        myImageButton = (ImageButton)findViewById(R.id.myImageButton);
        myButton = (Button)findViewById(R.id.myButton);
        myTextView = (TextView)findViewById(R.id.myTextView1);
        
        //通过OnFocusChangeListener来响应ImageButton的onFocus事件
        myImageButton.setOnFocusChangeListener(new ImageButton.OnFocusChangeListener() {
        	public void onFocusChange(View v, boolean hasFocus) {
        		//如果ImageButton得到焦点onFocus则改变ImageButton的图片
        		if(hasFocus==true) {
        			//更改状态说明
        			myTextView.setText(&quot;图片按钮状态为:Got Focus&quot;);
        			//更改按钮背景图片
        			myImageButton.setImageResource(R.drawable.iconfull);
        		} else {
        			myTextView.setText(&quot;图片按钮状态为: Lost Focus&quot;);
        			myImageButton.setImageResource(R.drawable.iconempty);
        		}
        	}
        });
        
        //通过onClickListener来响应ImageButton的onClick事件
        myImageButton.setOnClickListener(new ImageButton.OnClickListener(){
        	public void onClick(View v) {
        		//如果ImageButton状态为onClick则改变ImageButton的图片和说明
        		myTextView.setText(&quot;图片按钮状态为: Got Click&quot;);
        		myImageButton.setImageResource(R.drawable.iconfull);
        	}
        });
        
        //通过onClickListener来响应Button的onClick事件
        myButton.setOnClickListener(new Button.OnClickListener(){
        	public void onClick(View v) {
        		//如果Button状态为onClick改变ImageButton图片
        		myTextView.setText(&quot;图片按钮状态为:Lost Focus&quot;);
        		myImageButton.setImageResource(R.drawable.iconempty);
        	}
        });
    }
}

  • 大小: 32.5 KB

struts2+jfreechart整合

struts2 + jfreechart整合:
1、配置环境:
 在struts2中,默认的struts-default.xml中,并没有包含chart的result-type,它是插件的形式使用的。
 把 struts2的解压包的lib里找到struts2-jfreechart-plugin-2.1.8.1.jar,拷贝到你的项目的 classpath里,
 因为这个插件里的文件struts-plugin.xml里有一个chart的result-type。内容如下:

	<package name="jfreechart-default" extends="struts-default">
       	<result-types>
    		<result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult">
    			<param name="height">150</param>
    			<param name="width">200</param>
    		</result-type>
    	</result-types>
    </package>

 

 

 同时把jfreechart的库文件jfreechart-1.0.13.jar和jcommon-1.0.16.jar拷贝到你的项目的 classpath里。

 

2、修改web.xml,增加下面的struts2的配置:

	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
		<init-param>
			<param-name>struts.i18n.encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 

 

3、在src目录下增加新建一个struts.xml配置文件,其主要内容如下:

	<!--
		关于extends继承jfreechart-default这点请大家注意
		因为在struts-default这个包里并没有result-type为chart的 chart
		定义在前面我们导入的struts2-jfreechart-plugin-2.1.8.jar 下面的struts-plugin.xml文件中
	-->
	<package name="jfreechart" extends="jfreechart-default">
		<action name="jfreechart" class="org.usc.actions.JfreeChartAction">
			<result name="success" type="chart">
				<param name="width">600</param>
				<param name="height">400</param>
			</result>
		</action>
	</package>

 

 

4、写测试页面:

	<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>
	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	  <head>
		<base href="<%=basePath%>">
		<title>jfreechart</title>
	  </head>
	  <body>
		 <img alt="jfreechart" src="jfreechart.action"/>
	  </body>
	</html>

 

 

5、在你的action代码里,返回一个JFreeChart对象即可:

	/**
	 * File   : JfreeChartAction.java
	 * Author : zqding
	 * Date   : 2010-7-27
	 * Version:
	 * Desc   : 	
	 */
	package org.usc.actions;

	import org.jfree.chart.ChartFactory;
	import org.jfree.chart.JFreeChart;
	import org.jfree.data.general.DefaultPieDataset;

	import com.opensymphony.xwork2.ActionSupport;

	public class JfreeChartAction extends ActionSupport {
		/**
		 * 定义JFreeChart对象 大家请注意在这里JFreeChart对象名只能为chart 
		 * 不能是别的, 关于这点大家可以上struts2网站上面查看一下
		 * http://struts.apache.org/2.x/docs/jfreechart-plugin.html
		 */
		private JFreeChart chart;
		
		public JFreeChart getChart() {
			return chart;
		}

		public void setChart(JFreeChart chart) {
			this.chart = chart;
		}

		@Override
		public String execute() throws Exception {
			 //设置数据
			DefaultPieDataset data = new DefaultPieDataset();
			data.setValue("Java", new Double(43.2));
			data.setValue("Visual Basic", new Double(1.0));
			data.setValue("C/C++", new Double(17.5)); 
			data.setValue("Android", new Double(60.0));
			//设置字体及生成的图片格式设置略,请参照API文档
			//生成JFreeChart对象
			chart = ChartFactory.createPieChart("Programme Language", data, true,true, false);
			return SUCCESS;
		}
	}

 

 6、发布到应用服务器,进行测试。
 http://localhost:9090/SSHDemo/jfreechart.jsp
 如下图:

jfreechart

AndroidSurfaceView

 

下面就贴上一个小程序代码,主要运用SurfaceView来实现在屏幕上画一个圆,你可以通过按方向键和触摸屏幕来改变圆的位置


代码:

Activity

 

  1. package com.view;  
  2.    
  3.  import android.app.Activity;  
  4.  import android.os.Bundle;  
  5.  import android.view.Window;  
  6.  import android.view.WindowManager;  
  7.    
  8.  public class MainActivity extends Activity {  
  9.      /** Called when the activity is first created. */  
  10.      @Override  
  11.      public void onCreate(Bundle savedInstanceState) {  
  12.          super.onCreate(savedInstanceState);  
  13.    
  14.          // 隐藏状态栏  
  15.          this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  16.                  WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  17.    
  18.          // 把Activity的标题去掉  
  19.          requestWindowFeature(Window.FEATURE_NO_TITLE);  
  20.    
  21.          // 设置布局  
  22.          this.setContentView(new MySurfaceView(this));  
  23.      }  
  24.  }  

 

SurfaceView

 

  1. package com.view;  
  2.    
  3.  import android.content.Context;  
  4.  import android.graphics.Canvas;  
  5.  import android.graphics.Color;  
  6.  import android.graphics.Paint;  
  7.  import android.view.KeyEvent;  
  8.  import android.view.MotionEvent;  
  9.  import android.view.SurfaceHolder;  
  10.  import android.view.SurfaceHolder.Callback;  
  11.  import android.view.SurfaceView;  
  12.    
  13.  public class MySurfaceView extends SurfaceView implements Runnable, Callback {  
  14.    
  15.      private SurfaceHolder mHolder; // 用于控制SurfaceView  
  16.    
  17.      private Thread t; // 声明一条线程  
  18.    
  19.      private boolean flag; // 线程运行的标识,用于控制线程  
  20.    
  21.      private Canvas mCanvas; // 声明一张画布  
  22.    
  23.      private Paint p; // 声明一支画笔  
  24.    
  25.      private int x = 50, y = 50, r = 10// 圆的坐标和半径  
  26.    
  27.      public MySurfaceView(Context context) {  
  28.          super(context);  
  29.    
  30.          mHolder = getHolder(); // 获得SurfaceHolder对象  
  31.          mHolder.addCallback(this); // 为SurfaceView添加状态监听  
  32.          p = new Paint(); // 创建一个画笔对象  
  33.          p.setColor(Color.WHITE); // 设置画笔的颜色为白色  
  34.          setFocusable(true); // 设置焦点  
  35.      }  
  36.    
  37.      /** 
  38.       * 自定义一个方法,在画布上画一个圆 
  39.       */  
  40.      public void Draw() {  
  41.          mCanvas = mHolder.lockCanvas(); // 获得画布对象,开始对画布画画  
  42.          mCanvas.drawRGB(000); // 把画布填充为黑色  
  43.          mCanvas.drawCircle(x, y, r, p); // 画一个圆  
  44.          mHolder.unlockCanvasAndPost(mCanvas); // 完成画画,把画布显示在屏幕上  
  45.      }  
  46.    
  47.      /** 
  48.       * 当SurfaceView创建的时候,调用此函数 
  49.       */  
  50.      @Override  
  51.      public void surfaceCreated(SurfaceHolder holder) {  
  52.          t = new Thread(this); // 创建一个线程对象  
  53.          flag = true// 把线程运行的标识设置成true  
  54.          t.start(); // 启动线程  
  55.      }  
  56.    
  57.      /** 
  58.       * 当SurfaceView的视图发生改变的时候,调用此函数 
  59.       */  
  60.      @Override  
  61.      public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  62.              int height) {  
  63.      }  
  64.    
  65.      /** 
  66.       * 当SurfaceView销毁的时候,调用此函数 
  67.       */  
  68.      @Override  
  69.      public void surfaceDestroyed(SurfaceHolder holder) {  
  70.          flag = false// 把线程运行的标识设置成false  
  71.      }  
  72.    
  73.      /** 
  74.       * 当屏幕被触摸时调用 
  75.       */  
  76.      @Override  
  77.      public boolean onTouchEvent(MotionEvent event) {  
  78.          x = (int) event.getX(); // 获得屏幕被触摸时对应的X轴坐标  
  79.          y = (int) event.getY(); // 获得屏幕被触摸时对应的Y轴坐标  
  80.          return true;  
  81.      }  
  82.        
  83.      /** 
  84.       * 当用户按键时调用 
  85.       */  
  86.      @Override  
  87.      public boolean onKeyDown(int keyCode, KeyEvent event) {  
  88.          if(keyCode == KeyEvent.KEYCODE_DPAD_UP){    //当用户点击↑键时  
  89.              y–;    //设置Y轴坐标减1  
  90.          }  
  91.          return super.onKeyDown(keyCode, event);  
  92.      }  
  93.    
  94.      @Override  
  95.      public void run() {  
  96.          while (flag) {  
  97.              Draw(); // 调用自定义画画方法  
  98.              try {  
  99.                  Thread.sleep(50); // 让线程休息50毫秒  
  100.              } catch (InterruptedException e) {  
  101.                  e.printStackTrace();  
  102.              }  
  103.          }  
  104.      }  
  105.    
  106.  }  


MySurfaceView首先继承SurfaceView,然后实现Runnable和Callback接口

 

重写了Runnable的run方法和Callback的surfaceCreated(SurfaceHolder holder),surfaceChanged(SurfaceHolder holder, int format, int width,int height),surfaceDestroyed(SurfaceHolder holder)方法,

还实现了onTouchEvent(MotionEvent event),onKeyDown(int keyCode, KeyEvent event)方法来,详细的在代码里已注释。

更多信息请查看 java进阶网 http://www.javady.com

【android开发】android文件搜索

目的:输入关键字KEY,sd卡中文件名包含KEY的文件路径显示在屏幕下方,如果没有,则toast提示,整个实现过程还是比较简单的。

思路: EditText — > button(onClick) –> getText –>ListFiles   indexof — > show

main.xml

 

< xml version="1.0" encoding="utf-8" >
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/widget0"
    >
    
<Button
	android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/button_search"
    android:layout_x="253px"
    android:layout_y="5px"
    android:text="@string/toSearch"
/>
<EditText
	android:layout_width="112px"
    android:layout_height="52px"
    android:id="@+id/key"
    android:textSize="18sp"
    android:layout_x="119px"
    android:layout_y="4px"
/>
<TextView
	android:layout_width="103px"
    android:layout_height="29px"
    android:id="@+id/TextView_showIn"
    android:layout_x="5px"
    android:layout_y="16px"
    android:textSize="20sp"
    android:text="@string/showInput"
/>
<TextView
	android:layout_width="fill_parent"
    android:layout_height="370px"
    android:id="@+id/TextView_Result"
    android:layout_x="0px"
    android:layout_y="60px"
/>
</AbsoluteLayout>

  Activity类内容

 

package com.android;

import java.io.File;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
// extends Activtiy 
//implements OnClickListener 实现click方法
public class Activity07 extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
	
	private File file;
	private String path;
	private String info;
	private String key; //关键字
	private TextView result; // 显示结果
	private EditText et; // 编辑view
	private Button search_btn; // button view
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        result = (TextView)findViewById(R.id.TextView_Result);
        et = (EditText)findViewById(R.id.key);
        search_btn = (Button)findViewById(R.id.button_search);
       // file = new File(Environment.getExternalStorageDirectory().getPath());
        file = new File("/sdcard/mp3");
        info = getString(R.string.info);
        
        search_btn.setOnClickListener(this);
    }

	/* (non-Javadoc)
	 * @see android.view.View.OnClickListener#onClick(android.view.View)
	 */
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		path = "";
		result.setText("");
		key = et.getText().toString();
		BrowserFile(file);
	}
	/**
	 * 校验 		toast提示
	 * @param file
	 */
	public void BrowserFile(File file) {
		if (key.equals("")) {
			Toast.makeText(this, getString(R.string.pleaseInput), Toast.LENGTH_LONG).show();
		} else {
			toSearchFiles(file);
			if (result.getText().equals("")) {
				Toast.makeText(this, getString(R.string.notFound), Toast.LENGTH_SHORT).show();
			}
		}
	}
    /**
     * 遍历 Files
     * @param file
     */
	public void toSearchFiles(File file) {
		File[] files = file.listFiles();
		for (File tf : files) {
			if (tf.isDirectory()) {
				toSearchFiles(tf);
			} else {
				try {
					if (tf.getName().indexOf(key) > -1) {
						path += "\n" + tf.getPath();
						result.setText(info+path);
					}
				} catch(Exception e) {
					Toast.makeText(this, getString(R.string.pathError), Toast.LENGTH_SHORT).show();
				}
			}
		}
	}
}

  String.xml

 

< xml version="1.0" encoding="utf-8" >
<resources>
    <string name="hello">Hello World, Activity07!</string>
    <string name="app_name">文件搜索</string>
    <string name="showInput">输入关键字</string>
    <string name="toSearch">搜索</string>
    <string name="info">系统SDCard目录文件路径:\n</string>
    <string name="pleaseInput">请输入关键字!</string>
    <string name="notFound">SD卡中没有相关文件!!</string>
    <string name="pathError">读取路径出错!!</string>
</resources>

查看SD卡MP3下的文件列表

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

效果

 

 

 

android全局变量及多activity退出

两种方式:

1、  static类型数据,直接类名访问

2、  Application接口

 

package com.main; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.Application; /** * 全局变量工具类 * @author Administrator * */ public class ActivityManage extends Application { private List<Activity> mainActivity = new ArrayList<Activity>(); @Override public void onCreate() { super.onCreate(); } //以下实现完全退出多activity的应用界面 /** * * @return */ public List<Activity> MainActivity () { return mainActivity ; } public void addActivity(Activity act) { mainActivity.add(act); } public void finishAll() { System.out.println(“activity num:” + mainActivity.size()); for(int index = 0; index < mainActivity.size(); index ++) { Activity act = (Activity)mainActivity.get(index); act.finish(); } mainActivity.clear(); } }


 必须在

AndroidManifest.xml中添加我们自己的Application

 

 

Eg:

<application

        android:icon=“@drawable/ic_launcher” 以前系统的

        android:label=“@string/app_name”    以前系统的

       android:name=“.ActivityManage”>    自己的Application

利用Application操作全局变量:

ActivityManage actM = (ActivityManage)getApplicationContext();

String strTemp = (editID.getText()).toString();//”01234567890″;//new String((String) textID.getText());

 actM.setDeviceID(strTemp);

 

 

利用Application接口实现退出多activity程序:

退出多activity应用程序实现:

每一个新的activity进入时,加上如下代码:

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        //

        ActivityManage actM = (ActivityManage)getApplicationContext();

        actM.addActivity(this);

        strDeviceID = actM.getDeviceID();

 

退出时:

ActivityManage actM = (ActivityManage)getApplicationContext(); actM.finishAll();


 

监听按键事件:

 

/** * 监听返回按键 */ public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){ //code…….. //System.exit(0); ActivityManage actM = ActivityManage)getApplicationContext(); actM.finishAll(); } return false; }


 注:需要在

AndroidMainfest.xml文件中在application标签添加:

 

<application android:icon=”@drawable/ic_launcher” android:label=”@string/app_name” android:name=”.ActivityManage” >

 


 

 ActivityManage中:

public void finishAll()
 {
  System.out.println(“activity num:” + mainActivity.size());
  for(int index = 0; index < mainActivity.size(); index ++)
  {
   Activity act = (Activity)mainActivity.get(index);
   act.finish();
  }
  mainActivity.clear();
  if(so != null)
  {
   so.socketDestory();
  }
  if(remoteDB != null)
  {
   remoteDB.closeDB();
  }
 }

获取未安装的APK图标

    /* 
     * 采用了新的办法获取APK图标,之前的失败是因为android中存在的一个BUG,通过 
     * appInfo.publicSourceDir = apkPath;来修正这个问题,详情参见: 
     * http://code.google.com/p/android/issues/detail id=9151 
     */  
    public static Drawable getApkIcon(Context context, String apkPath) {  
        PackageManager pm = context.getPackageManager();  
        PackageInfo info = pm.getPackageArchiveInfo(apkPath,  
                PackageManager.GET_ACTIVITIES);  
        if (info != null) {  
            ApplicationInfo appInfo = info.applicationInfo;  
            appInfo.sourceDir = apkPath;  
            appInfo.publicSourceDir = apkPath;  
            try {  
                return appInfo.loadIcon(pm);  
            } catch (OutOfMemoryError e) {  
                Log.e("ApkIconLoader", e.toString());  
            }  
        }  
        return null;  
    } 

Android事件模型【转】

以前写 android ,对事件的处理没有太深入,只是简单的 onTouchEvent 就 ok 了,现在写的 UI ,很多自定义组件,父 view 和子 view 都需要接收事件,然后处理。如果不弄明白它的事件传递机制,很难拥有好的用户体验。

Touchevent 中,返回值是 true ,则说明消耗掉了这个事件,返回值是 false ,则没有消耗掉,会继续传递下去,这个是最基本的。

在 View 中跟 Touch 相关的事件有 dispatchTouchEvent , interceptTouchEvnet , onTouchEvent 三种。 dispatchTouchEvent 是负责分发事件的,事件从 activity 传递出来之后,最先到达的就是最顶层 view 的 dispatchTouchEvent ,然后它进行分发,如果返回 false ,则交给这个 view 的 interceptTouchEvent 方法来决定是否要拦截这个事件,如果 interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果 interceptTouchEvent 返回 false ,那么就传递给子 view ,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。

如果事件传递到某一层的子 view 的 onTouchEvent 上了,这个方法返回了 false ,那么这个事件会从这个 view 往上传递,都是 onTouchEvent 来接收。而如果传递到最上面的 onTouchEvent 也返回 false 的话,这个事件就会“消失”,而且接收不到下一次事件。(我说的一次事件指的是 down 到 up 之间的一系列事件)

注:上半部分为父View,下半部分为子View;

完整的传递流程为:父View->子View->子View的子View->……->子View的子View->子View->父View。

如果整个流程中都没有处理掉这个事件,即所有处理的返回值均为false,则不会再传递下一次事件,因为他会认为你这次的事件阻塞了,没必要给下一次。

onTouchEvent如果不消耗的话,会从子view传递到父view。

转自:http://chroya.iteye.com/blog/668297

  • 大小: 36.2 KB

Android使用百度推送实现即时通讯的功能

在发表文章之前先给大家吐槽两句:

    我现在做Android已经有1年多的时间了,本篇文章是我发表的第一篇博客文章。此时心情难以形容,感觉给大家分享一些自己在开发过程中的经验感觉很高兴。

    下面开始说重点。本篇分享给大家的是我在使用百度及时通讯实现聊天功能时的一些总结。希望能够给大家带来帮助!我就不在文章中写怎样实现功能了,都在下载包中。如果大家看过之后感觉有什么可以改进的可以回复告知我一下!谢谢!

    服务端发送通知的代码之后会给大家分享,服务端发送通知的代码还没有总结出来!晚一些再做分享!


  • 大小: 9.7 KB