Android_notification的應用

在網上找的代碼,註釋比較好,代碼也寫得很規範,就是找不到作者,這裏先感謝他。


直接看源碼:

notificationActivity

package com.example.notificationdemo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RemoteViews;
import android.widget.TextView;
import android.widget.Toast;
/**
 * @author devilmaycry
 * 改Demo的主要功能爲下載應用,並在通知欄顯示其進度,下載完成後會有一個對話框提示用戶是否安裝,如果不需要可以刪除
 * 建議看代碼的童鞋,用eclipse看,並且雙擊類標籤全屏看(因爲寫代碼的時候是全屏下寫的,寫完後也沒有對代碼進行format,註釋和代碼都是一句到底不換行);
 */
public class MainActivity extends Activity {
	private int progress; // 定義進度值
	int handmsg = 1;//
	private NotificationManager nm = null;
	private Notification nn = null; // 引入通知
	private RemoteViews view = null; // 用來設置通知的View
	private String apkDownloadPath; // 應用下載的地址
	private String savePath; // APK下載之後保存的地址
	private String saveFileName; // APK的文件名
	private static final int DOWN_UPDATE = 0;// 下載中消息
	private static final int DOWN_OVER = 1;// 下載完成消息
	private TextView marquee;//跑馬燈文本框
	private Button start;//開始按鈕
	private Button install;//安裝;主要是用來當第一次下載完成提示安裝時,用戶選擇錯誤,到時對話框消失,點擊此按鈕可以重新彈出對話框
	private AlertDialog dlg = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//獲取系統通知的服務
		nn = new Notification();//創建一個通知對象
		marquee = (TextView) findViewById(R.id.marquee);//獲取跑馬燈文本控件
		marquee.setText("請注意:這裏的應用是在應用商店裏隨便找的一個應用,如果怕不安全可以手動更改apkDownloadPath的值,來下載你想要下載的APK");
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		//這是百度應用商店上的一個叫魔幻古箏的APK安裝包,有其他需要可以自己找,是個安裝包的路徑就行
		apkDownloadPath = "http://gdown.baidu.com/data/wisegame/a5947fef7e036da5/MagicZither_7.apk";
		// 存放位置爲手機默認目錄下的NotificationDemo文件夾(如果沒有會默認生成一個這樣的文件夾,詳見下載塊)
		savePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/NotificationDemo";
		// 爲了測試我們把下載的apk的文件名也明明爲NotificationDemo
		saveFileName = savePath + "/NotificationDemo.apk";
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		install = (Button) findViewById(R.id.install);//獲取安裝按鈕控件
		start = (Button) findViewById(R.id.start_all);//獲取啓動按鈕控件
		//啓動按鈕的監聽
		start.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				install.setVisibility(View.GONE);
				ShowToast("開始在後臺下載新版本", MainActivity.this);
				view = new RemoteViews(getPackageName(), R.layout.download_progress_state_view);
				nn.icon = R.drawable.ic_launcher;
				view.setImageViewResource(R.id.download_progress_img, R.drawable.ic_launcher);
				//new Thread(mdownApkRunnable).start();
				//如需使用外部瀏覽器下載,註釋掉上邊的線程,解開此句即可
				downloadByBrowser(apkDownloadPath);
			}
		});
		install.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				dlg.show();
			}
		});
	}

	// 下載APK的線程匿名類START
	private Runnable mdownApkRunnable = new Runnable() {
		@Override
		public void run() {
			try {
				URL url = new URL(apkDownloadPath);
				HttpURLConnection conn = (HttpURLConnection) url.openConnection();
				conn.connect();
				int length = conn.getContentLength();
				InputStream is = conn.getInputStream();

				File file = new File(savePath);
				Log.e("test", file.exists()+"");
				if (!file.exists()) {
					Log.e("test1", file.exists()+"");
					file.mkdir();
					Log.e("test2", file.exists()+"");
				}
				String apkFile = saveFileName;
				Log.e("test3", apkFile);
				File ApkFile = new File(apkFile);
				FileOutputStream fos = new FileOutputStream(ApkFile);

				int count = 0;
				byte buf[] = new byte[1024];
				do {
					int numread = is.read(buf);
					count += numread;
					progress = (int) (((float) count / length) * 100);
					if(handmsg < progress){
						handmsg ++;
						mHandler.sendEmptyMessage(DOWN_UPDATE);
					}
					// 更新進度
					if (numread <= 0) {
						// 下載完成通知安裝
						mHandler.sendEmptyMessage(DOWN_OVER);
						break;
					}
					fos.write(buf, 0, numread);
				} while (true);// 點擊取消就停止下載.
				fos.close();
				is.close();
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
				Log.e("test", e.getMessage());
			}
		}
	};
	// 下載APK的線程匿名類END

	// 處理下載進度的Handler Start
	private Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case DOWN_UPDATE:
				ShowToast(progress, MainActivity.this);
				view.setProgressBar(R.id.download_progressbar, 100, handmsg,false);
				view.setTextViewText(R.id.download_progress_text, handmsg + "%");
				//設置notification的顯示View
				nn.contentView = view;
				
				//通知顯示notification
				nm.notify(0, nn);
				super.handleMessage(msg);
				break;
			case DOWN_OVER:
				install.setVisibility(View.VISIBLE);
				ShowToast("下載完成",MainActivity.this);
				dlg = new AlertDialog.Builder(MainActivity.this)
				.setTitle("安裝")
				.setMessage("下載完成是否安裝")
				.setPositiveButton("安裝",new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						installApk();
						install.setVisibility(View.GONE);
					}})
				.setNegativeButton("刪除",new DialogInterface.OnClickListener(){
					@Override
					public void onClick(DialogInterface dialog, int which) {
						if(deleteAllFilesOfDir(new File(savePath))){
							ShowToast("存放目錄和APK已刪除", MainActivity.this);
						}else{
							ShowToast("刪除失敗,請檢查路徑,並手動刪除", MainActivity.this);
						}
						install.setVisibility(View.GONE);
					}
				})
				.setNeutralButton("取消", new DialogInterface.OnClickListener(){
					@Override
					public void onClick(DialogInterface dialog, int which) {
						dlg.dismiss();
					}
				}).show();
				break;
			default:
				break;
			}
		};
	};
	// 處理下載進度的Handler End
	
	
	//Toast方法(實在是懶得寫一次Toast就寫一次make寫一次show。有時候show還忘了。。就這麼幹了,成學員要學着變懶纔有優化代碼的動力)
	private static void ShowToast(Object msg,Context context){
		Toast.makeText(context, msg+"", Toast.LENGTH_SHORT).show();
	}

	// 安裝apk
	private void installApk() {
		File apkfile = new File(saveFileName);
		if (!apkfile.exists()) {
			ShowToast("要安裝的文件不存在,請檢查路徑", MainActivity.this);
			return;
		}
		Intent i = new Intent(Intent.ACTION_VIEW);
		i.setDataAndType(Uri.parse("file://" + apkfile.toString()),
				"application/vnd.android.package-archive");
		startActivity(i);
	}

	// 刪除APK
	/**
	 * @param path  Apk存放的目錄,是目錄,不是APK文件的路徑!否則只會刪除APK 不會刪除存放的目錄
	 * @return 
	 */
	public static boolean deleteAllFilesOfDir(File path) {  
	    if (!path.exists())  
	        return false;  
	    if (path.isFile()) {  
	        path.delete();  
	        return true;  
	    }  
	    File[] files = path.listFiles();  
	    for (int i = 0; i < files.length; i++) {  
	        deleteAllFilesOfDir(files[i]);  
	    }  
	    path.delete();  
	    return true;
	}  
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	//其實下載應用還有一個更簡單的方法,只不過需要藉助其他的瀏覽器應用,沒法跟蹤進度,Notification也是瀏覽器自帶的,不過如果是需要做版本
	//更新的童鞋倒是推薦用下面的方法,因爲不要自己動手,不佔自己應用的資源,Notification是瀏覽器自帶的,可以顯示下載進度,比較的簡便
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	private void downloadByBrowser(String apkDownloadPath){
		Uri uri  = Uri.parse(apkDownloadPath);
		Intent intent = new Intent(Intent.ACTION_VIEW,uri);
		startActivity(intent);
	}
	//就這樣就行了,剩下的就交給外部的瀏覽器就行了。。。。。。。
}

兩個佈局文件很簡單,這裏就不貼出來了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章