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");
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

【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下的文件列表

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

效果

 

 

 

获取手机号

package com.action;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.widget.Toast;

public class Main extends Activity {
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TelephonyManager tm = (TelephonyManager)Main.this.getSystemService(Context.TELEPHONY_SERVICE);
        String phoneId = tm.getLine1Number();
        setTitle(phoneId);
        Toast.makeText(Main.this, "手机号:" + phoneId, Toast.LENGTH_LONG).show();
        setContentView(R.layout.main);
    }
}

 

 

 配置文件:

< xml version="1.0" encoding="utf-8" >
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.action"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Main"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
		<uses-permission android:name="android.permission.READ_PHONE_STATE" />
    </application>


</manifest> 

 这个例子可以获取到大部分手机号码段,后来,在做项目测试时,发现该程序提取不到186段的手机号,欢迎朋友回贴交流

AndroidWebView的缓存

各位读者大家好,最近比较忙好久没有写blog了,今天挤点时间和大家分享一下Android中WebView的缓存。我们在项目中也时常会用到
WebView这个控件,当我们加载html时候,会在我们data/应用package下生成database与cache两个文件夹如下图如示:

我们请求的url记录是保存在webviewCache.db里,而url的内容是保存在webviewCache文件夹下.

为了让大家更容易理解,我做一个简单的例子,我定义一个html文件,在里面加载了一个淘宝的衣服图片的url,用WebView加载出来,然后再试着从缓存里把这张图片读取出来。

下面大家可以按照我的步骤一步一步来实践:

第一步:新建一个Android工程命名为WebViewCacheDemo.目录结构如下:

第二步:在assets目录下新建一个html文件,命名为index.html,(这里加载了一个淘宝的图片):

http://img04.taobaocdn.com/imgextra/i4/608825099/T2nGXBXXpaXXXXXXXX_!!608825099.jpg_310x310.jpg

 

第三步:修改main.xml布局文件一个WebView控件一个Button(点击加载缓存图片用),代码如下:

view plaincopy to clipboardprint 
  1. < xml version=
    “1.0”
     encoding=
    “utf-8”
     >  
  2. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
      
  3.     android:orientation=“vertical”
      
  4.     android:layout_width=“fill_parent”
      
  5.     android:layout_height=“fill_parent”
      
  6.     >  
  7.     <WebView  
  8.         android:id=“@+id/webview”
      
  9.         android:layout_width=“fill_parent”
      
  10.         android:layout_height=“wrap_content”
          
  11.     />  
  12.     <Button  
  13.         android:id=“@+id/button”
      
  14.         android:layout_width=“fill_parent”
      
  15.         android:layout_height=“wrap_content”
      
  16.         android:text=“从缓存里读取图片”
      
  17.     />  
  18. </LinearLayout>  

 

第四步:修改主核心程序WebViewCacheDemo.java,这里我只加载了index.html文件,按钮事件暂时没写,代码如下:

view plaincopy to clipboardprint 
  1. package
     com.tutor.webviewcache;  
  2. import
     android.app.Activity;  
  3. import
     android.os.Bundle;  
  4. import
     android.view.View;  
  5. import
     android.view.View.OnClickListener;  
  6. import
     android.webkit.WebView;  
  7. import
     android.widget.Button;  
  8. public
     
    class
     WebViewCacheDemo 
    extends
     Activity {  
  9.       
  10.     private
     WebView mWebView;  
  11.     //private Button mButton;
      
  12.     private
     
    static
     
    final
     String url = 
    “file:///android_asset/index.html”
    ;  
  13.     @Override
      
  14.     public
     
    void
     onCreate(Bundle savedInstanceState) {  
  15.         super
    .onCreate(savedInstanceState);  
  16.         setContentView(R.layout.main);  
  17.           
  18.         mWebView = (WebView)findViewById(R.id.webview);  
  19.         mWebView.loadUrl(url);  
  20.           
  21. //        mButton = (Button)findViewById(R.id.button);
      
  22. //        mButton.setOnClickListener(listener);
      
  23.     }  
  24. }  

 

第五步:在AndroidMainifest.xml文件中加访问网络的权限:

view plaincopy to clipboardprint 
  1. <uses-permission android:name=
    “android.permission.INTERNET”
     />  


运行效果如下:


此时我们在WebViewCache.db里的cache.table里多了一条记录如下图所示:


在cache/webviewCache/目录下多了一个10d8d5cd文件,刚好和cache.table里的filepath,我们可以断定这个文件就是我们从网上拽下来的图片:

为了验证猜想,我给Button增加事件响应,就是弹出Dialog,里面加载缓存的图片,完整代码如下:

view plaincopy to clipboardprint 
  1. package
     com.tutor.webviewcache;  
  2. import
     java.io.File;  
  3. import
     java.io.FileInputStream;  
  4. import
     java.io.FileNotFoundException;  
  5. import
     android.app.Activity;  
  6. import
     android.app.Dialog;  
  7. import
     android.graphics.Bitmap;  
  8. import
     android.graphics.BitmapFactory;  
  9. import
     android.os.Bundle;  
  10. import
     android.view.View;  
  11. import
     android.view.View.OnClickListener;  
  12. import
     android.view.ViewGroup.LayoutParams;  
  13. import
     android.webkit.WebView;  
  14. import
     android.widget.Button;  
  15. import
     android.widget.ImageButton;  
  16. import
     android.widget.ImageView;  
  17. public
     
    class
     WebViewCacheDemo 
    extends
     Activity {  
  18.       
  19.     private
     WebView mWebView;  
  20.     private
     Button mButton;  
  21.     private
     
    static
     
    final
     String url = 
    “file:///android_asset/index.html”
    ;  
  22.     @Override
      
  23.     public
     
    void
     onCreate(Bundle savedInstanceState) {  
  24.         super
    .onCreate(savedInstanceState);  
  25.         setContentView(R.layout.main);  
  26.           
  27.         mWebView = (WebView)findViewById(R.id.webview);  
  28.         mWebView.loadUrl(url);  
  29.           
  30.         mButton = (Button)findViewById(R.id.button);  
  31.         mButton.setOnClickListener(listener);  
  32.     }  
  33.         
  34.     //button点击事件
      
  35.     OnClickListener listener = new
     Button.OnClickListener(){  
  36.         @Override
      
  37.         public
     
    void
     onClick(View v) {  
  38.             ImageView mImageView = new
     ImageButton(WebViewCacheDemo.
    this
    );  
  39.             mImageView.setImageBitmap(getPictureFromCache());  
  40.             Dialog d = new
     Dialog(WebViewCacheDemo.
    this
    );  
  41.             d.setTitle(“从缓存里读取图片”
    );  
  42.             d.setContentView(mImageView,   
  43.             new
     LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));  
  44.             d.show();  
  45.         }  
  46.           
  47.     };  
  48.     //从缓存里读取图片,实际实用中会比这个灵活多,我这里写死了
      
  49.     private
     Bitmap getPictureFromCache(){  
  50.         Bitmap bitmap = null
    ;  
  51.         File file = new
     File(getCacheDir()+
    “/webviewCache/10d8d5cd”
    );  
  52.         try
     {  
  53.             FileInputStream is = new
     FileInputStream(file);  
  54.             bitmap = BitmapFactory.decodeStream(is);  
  55.         } catch
     (FileNotFoundException e) {  
  56.             e.printStackTrace();  
  57.         }  
  58.         return
     bitmap;  
  59.     }  
  60. }  

 

第六步:再次运行工程,点击button按钮,效果如下图所示:

OK,验证成功,呵呵,今天只是一个简单的小例子加深大家理解,实际应用肯定比这个复杂的多,希望对大家有所帮助,谢谢!

GoogleMap(通过输入地址,查询显示在google地图上)

主Activity:

package net.blogjava.mobile.map;

import java.util.List;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;

public class Main extends MapActivity {
	private MapController mapController;
	private GeoPoint geoPoint;
	List<Address> addresses;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// 用于显示地图的一个ViewGroup
		MapView mapView = (MapView) findViewById(R.id.mapview);

		// 使得这个View可以获得点击事件
		mapView.setClickable(true);

		// 设置是否可以进行自动缩放控制
		mapView.setBuiltInZoomControls(true);

		// 获取控制缩放的操作对象
		mapController = mapView.getController();

		// 通过系统默认区域设置进行地图定位
		Geocoder gc = new Geocoder(this);
		// mapView.setTraffic(true);
		// mapView.setSatellite(true);
		mapView.setStreetView(true);

		try {
			// 通过地址名称描述返回一个查询结果的数组(后面参数为返回最大结果数)
			addresses = gc.getFromLocationName("荆州市江陵中学", 5);

			// 如果未查询到任何结果
			if (addresses != null) {
				geoPoint = new GeoPoint(
				// 返回纬度,经度
						(int) (addresses.get(0).getLatitude() * 1E6),
						(int) (addresses.get(0).getLongitude() * 1E6));

				setTitle(addresses.get(0).getFeatureName());
				MyOverlay myOverlay = new MyOverlay();
				mapView.getOverlays().add(myOverlay);
				mapController.setZoom(20);
				mapController.animateTo(geoPoint);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}

	class MyOverlay extends Overlay {

		@Override
		public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
				long when) {
			Paint paint = new Paint();
			paint.setColor(Color.RED);
			Point screenPoint = new Point();
			mapView.getProjection().toPixels(geoPoint, screenPoint);
			Bitmap bmp = BitmapFactory.decodeResource(getResources(),
					R.drawable.flag);
			canvas.drawBitmap(bmp, screenPoint.x, screenPoint.y, paint);
			canvas.drawText(addresses.get(0).getFeatureName().toString(),
					screenPoint.x, screenPoint.y, paint);
			return super.draw(canvas, mapView, shadow, when);
		}

	}

}

配置文件:

< xml version="1.0" encoding="utf-8" >
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="net.blogjava.mobile.map" android:versionCode="1"
	android:versionName="1.0">
	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<activity android:name=".Main" android:label="@string/app_name">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
		<uses-library android:name="com.google.android.maps" />
	</application>
	<uses-sdk android:minSdkVersion="3" />
	<uses-permission android:name="android.permission.INTERNET" />
</manifest> 

main.xml:

< xml version="1.0" encoding="utf-8" >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<com.google.android.maps.MapView
		android:id="@+id/mapview" android:layout_width="fill_parent"
		android:layout_height="fill_parent" 
		android:apiKey="0y_0zdWEE7Cd9rf2h8PcSNl2itJSrEaOMLSIJ1g" />
</LinearLayout>

LinearLayout+EditText+Button+AlertDialog简单应用

这个简单的例子是EditText中默认有个字符串text,单击Show按钮,弹出AlertDialog显示EditText中的内容,单击Clear按钮,清除EditText中的内容!!
 效果图:

Activity用到两个LinearLayout,两个Button,一个TextView,一个EditText!

main.xml代码如下:

< xml version="1.0" encoding="utf-8" >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
<EditText
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/text"
    android:id="@+id/text"
    />
<LinearLayout
	android:id="@+id/linearlayout1"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:gravity="center"
	>
	<Button
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="@string/btnShow"
		android:id="@+id/btnShow"
		/>
	<Button
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="@string/btnClear"
		android:id="@+id/btnClear"
		/>
</LinearLayout>
</LinearLayout>

 java代码为:

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class practice extends Activity {
	Button btnShow;
    Button btnClear;
    EditText text;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        btnShow = (Button)findViewById(R.id.btnShow);
        btnClear = (Button)findViewById(R.id.btnClear);
        text = (EditText)findViewById(R.id.text);
        
        btnShow.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
					new AlertDialog.Builder(practice.this)
					.setTitle("Infomation")
					.setIcon(android.R.drawable.ic_dialog_dialer)
					.setMessage(text.getText())
					.show();
			}
		});
        
        btnClear.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				text.setText("");
			}
		});
    }
}

 

<!–StartFragment –>

  • 大小: 11.5 KB

BroadcastReceiver的生命周期

  BroadcastReceiver在android中是一特色功能.android系统的很多消息(如系统启动,新短信,来电话等)都通过BroadcastReceiver来分发.BroadcastReceiver的生命周期是短暂的,而且是消息一到达则创建执行完毕就立刻销毁的.为了说明这一点,我通过注册一个Alarm Service每7秒钟触发产生一次BroadcastReceive事件.

 

以下是BroadcastReceive的实现

	protected static final class AlarmReceiver extends BroadcastReceiver{
		public AlarmReceiver()
		{
			//查看类创建的进程id和线程id
			Log.i("AlarmReceiver.AlarmReceiver()", Calendar.getInstance().getTime().toLocaleString());
			Log.i("AlarmReceiver.AlarmReceiver() -> pid", String.valueOf(android.os.Process.myPid()));
			Log.i("AlarmReceiver.AlarmReceiver() -> tid", String.valueOf(android.os.Process.myTid()));
		}
		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			Log.i("AlarmReceiver.onReceive()", Calendar.getInstance().getTime().toLocaleString());
		}
	}

 

通过一个”Start”按钮和一个”Stop”按钮来控制消息.

	public void onClick(View arg0) {
		// TODO Auto-generated method stub
		switch(arg0.getId()){
		case R.id.btnStart:
			Log.i("current pid", String.valueOf(android.os.Process.myPid()));
			Log.i("current tid", String.valueOf(android.os.Process.myTid()));
			
			((AlarmManager)this.getSystemService(Context.ALARM_SERVICE))
				.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 7*1000, 
					 PendingIntent.getBroadcast(this, 0, new Intent(this,AlarmReceiver.class), 0)
					);
			break;
		case R.id.btnStop:
			((AlarmManager)this.getSystemService(Context.ALARM_SERVICE))
				.cancel(PendingIntent.getBroadcast(this, 0, new Intent(this,AlarmReceiver.class), 0));
			break;
		}
	}

 

打开logCat选择I,运行清理掉所有日志点击”Start”按钮

从上图可以看到AlarmReceiver类的实例是每触发一次就新建一次的,而且和程序是在同一个进程同一线程内.

 

Android应用程序退出的四种方法

   Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A。在B中如何关闭整个Android应用程序呢 本人总结了几种比较简单的实现方法。

  1. Dalvik VM的本地方法

android.os.Process.killProcess(android.os.Process.myPid()) //获取PID

System.exit(0); //常规java、c#的标准退出法,返回值为0代表正常退出

   2. 任务管理器方法  首先要说明该方法运行在Android 1.5 API Level为3以上才可以,同时需要权限

Java代码:

ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);

am.restartPackage(getPackageName());

  系统会将,该包下的 ,所有进程,服务,全部杀掉,就可以杀干净了,要注意加上

       3. 根据Activity的声明周期

  我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标志 Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。

  在A窗口中使用下面的代码调用B窗口

Java代码:

Intent intent = new Intent();

intent.setClass(Android123.this, CWJ.class);

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG设置

startActivity(intent);

  接下来在B窗口中需要退出时直接使用finish方法即可全部退出。

        4.自定义一个Actiivty 栈,道理同上,不过利用一个单例模式的Activity栈来管理所有Activity。并提供退出所有Activity的方法。代码如下:

Java代码:

public class ScreenManager {

private static Stack activityStack;

private static ScreenManager instance;

private ScreenManager(){

}

public static ScreenManager getScreenManager(){

if(instance==null){

instance=new ScreenManager();

}

return instance;

}

//退出栈顶Activity

public void popActivity(Activity activity){

if(activity!=null){

activity.finish();

activityStack.remove(activity);

activity=null;

}

}

//获得当前栈顶Activity

public Activity currentActivity(){

Activity activity=activityStack.lastElement();

return activity;

}

//将当前Activity推入栈中

public void pushActivity(Activity activity){

if(activityStack==null){

activityStack=new Stack();

}

activityStack.add(activity);

}

//退出栈中所有Activity

public void popAllActivityExceptOne(Class cls){

while(true){

Activity activity=currentActivity();

if(activity==null){

break;

}

if(activity.getClass().equals(cls) ){

break;

}

popActivity(activity);

}

}

}

游戏开发4_01数据存储–io

package wyf.wpf;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import org.apache.http.util.EncodingUtils;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

public class Sample_4_1 extends Activity {

public static final String ENCODING = “UTF-8”; //常量,代表编码格式

String fileName = “test.txt”;//文件的名称

String message = “你好,这是一个关于文件I/O的示例。”; //写入和读出的数据信息

TextView tv; //TextView对象引用

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);//设置当前屏幕

writeFileData(fileName, message);//创建文件并写入数据

        String result = readFileData(fileName);//获得从文件读入的数据

        tv = (TextView)findViewById(R.id.tv);//根据id获取屏幕中TextView对象的引用

        tv.setText(result);//设置TextView的内容

    }

    //方法:向指定文件中写入指定的数据

    public void writeFileData(String fileName,String message){

    try{

    FileOutputStream fout = openFileOutput(fileName, MODE_PRIVATE);//获得FileOutputStream对象

    byte [] bytes = message.getBytes();//将要写入的字符串转换为byte数组

    fout.write(bytes);//将byte数组写入文件

    fout.close();//关闭FileOutputStream对象

    }

    catch(Exception e){

    e.printStackTrace();//捕获异常并打印

    }

    }   

    //方法:打开指定文件,读取其数据,返回字符串对象

    public String readFileData(String fileName){

    String result=””;

    try{

    FileInputStream fin = openFileInput(fileName);//获得FileInputStream对象

    int length = fin.available();//获取文件长度

    byte [] buffer = new byte[length];//创建byte数组用于读入数据

    fin.read(buffer);//将文件内容读入到byte数组中   

    result = EncodingUtils.getString(buffer, ENCODING);//将byte数组转换成指定格式的字符串

    fin.close(); //关闭文件输入流

    }

    catch(Exception e){

    e.printStackTrace();//捕获异常并打印

    }

    return result;//返回读到的数据字符串

    }   

}

Notification基础应用

package com.tf.android.test;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.content.Intent;
 
/**
 * @title: 通知
 * @description: HelloWorld
 * @version 1.0
 * @created on 2010-12-3 下午02:33:14
 */

public class NotificationActivity extends Activity 
{
	private static final int NOTICE_ID = 1222;
	private Button notify;
	private Button cancel;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        notify = (Button)findViewById(R.id.noti);
        cancel = (Button)findViewById(R.id.cancel);
        
        notify.setOnClickListener(new View.OnClickListener() 
        {
			@Override
			public void onClick(View v)
			{
				notityMe();
			}
		});
        
        cancel.setOnClickListener(new View.OnClickListener() 
        {
			@Override
			public void onClick(View v)
			{
			   	final NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
			   	manager.cancel(NOTICE_ID);
			}
		});
    }
    
    private void notityMe()
    {  
    	//获得通知管理器,通知是一项系统服务  
    	final NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);  
    	//初始化通知对象 p1:通知的图标 p2:通知的状态栏显示的提示 p3:通知显示的时间  
    	Notification notification = new Notification(R.drawable.icon, "通知测试", System.currentTimeMillis()); 
    	//点击通知后的Intent,此例子点击后还是在当前界面 
    	PendingIntent intent = PendingIntent.getActivity(this, 0, new Intent(this, NotificationActivity.class), 0);
    	//设置通知信息  
    	notification.setLatestEventInfo(this, "通知title", "通知信息内容", intent); 
    	//通知 
    	manager.notify(NOTICE_ID, notification); 
    }
}