基本技术

下载时显示进度条

在文件下载处理业务类中

 1 public  File getFile(String path,String filePath,ProgressDialog pd)throws Exception{
 2         URL url=new URL(path);
 3         HttpURLConnection conn=(HttpURLConnection) url.openConnection();
 4         conn.setRequestMethod("GET");
 5         conn.setConnectTimeout(2000);
 6         int coad=conn.getResponseCode();
 7         if(coad==200){//当匹配返回码时,将输入流里的东西全部写到输出流里面
 8             int total=conn.getContentLength();
 9             pd.setMax(total);
10             InputStream is=conn.getInputStream();//得到服务器的返回流
11             File file=new File(filePath);//创建一个本地文件,用于接收返回来的数据流
12             FileOutputStream out=new FileOutputStream(file); //创建输出流,将
13             byte[] buffer=new byte[1024];
14             int len=0;//计算读流的长度
15             int process=0;//设置进度条的初始值为0
16             while( (len = is.read(buffer))!=-1){//当读到的长度不为-1时,即还没有读到文件的末尾
17                 out.write(buffer, 0, len);//将buffer中的内容读到输出流里面
18                 process+=len;//将数据长度赋给进度
19                 pd.setProgress(process);//将进度值加入到进度条中
20                 
21             }
22             out.flush();
23             out.close();
24             is.close();
25             return file;
26         }
27         return null;
28     }View Code 
View Code

 主界面中pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置水平的下载进度条

然后调用此业务类方法

让Activity停顿3秒

这个必须放在子线程中操作

先创建一个子线程停顿3秒,然后调用Handler机制告知主线程

//让当前Activity延时2秒钟
        new Thread(){

            @Override
            public void run() {
                
                super.run();
                try {
                    sleep(2000);
                    handler.sendEmptyMessage(0);//放送空消息
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        }.start();
private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {//接收子线程传来的消息
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            //isNeedUpdate(versionText);//创建该方法进行比较
            if(isNeedUpdate(versiontext)){
                Log.i(TAG, "弹出升级提示对话框");
                showUpdateDialog();//用方法实现
            }
        }
    };

 3、在更新程序的时候,必须保证程序的签名和包名相同

C:UsersAdministrator.androiddebug.keystore这是程序开发时生成的签名文件,当我们发布程序的时候要有个自己的签名。

 签名生成方法:选择程序导出Export Android Application选择工程生成签名填写相关信息来生打包APK文件

4Activity.this和applicationContext两种上下文的却别

要挂载对话框,则要在Activity中。

土司则两者都可以挂载

applicationContext:生命周期,进程存在,上下文就存在

activity.this:activity在任务栈上下文存在

 5、创建gridView的布局(本例为网格视图)

创建一个GridView布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/background" 
    >
    <GridView 
        android:id="@+id/gv"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:horizontalSpacing="15dip"//每个图标之间的间距
        android:verticalSpacing="15dip"
        android:numColumns="3"//此处设置3列
        ></GridView>
    

</LinearLayout>

  

为gridView创建适配器

定义出图标布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dip"
    android:layout_height="100dip"
    android:orientation="vertical" 
    android:gravity="center"
    android:background="@drawable/icon_background">
    
    <ImageView 
        android:layout_width="60dip"
        android:layout_height="60dip"
        android:id="@+id/icon_iv"
        android:scaleType="fitXY"//设置图片缩放
        android:src="@drawable/ic_launcher"
        />
    <TextView 
        android:id="@+id/icon_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="功能名称"
        android:textSize="18sp"
        android:textColor="#ffd0d0d0"
        />

</LinearLayout>

  给这个图标布局设置背景icon_background.xml(在drawable文件夹下)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <stroke
        android:width="1dip"
        android:color="#ff202020"/>
    <corners 
        android:radius="2dip"/>
    <solid
        android:color="#ff404040"
        />
    

</shape>

  适配器文件mainAdapter.java

package com.example.mobilesafe.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.mobilesafe.R;



public class mainAdapter extends BaseAdapter{
	private LayoutInflater inflater;
	private Context context;
	private static ImageView icon_iv;
	private static TextView icon_tv;
	public mainAdapter(Context context) {//要有填充器先得拿到构造方法
		this.context = context;
		inflater=LayoutInflater.from(context);//将填充器初始化
	}

	private static String[] mainNames={"手机防盗","通讯卫士","软件管理","任务管理","上网管理",
			"手机杀毒","系统优化","高级工具","设置中心"};
	private static int[] mainPics={R.drawable.widget01,R.drawable.widget02,R.drawable.widget03,R.drawable.widget04
		,R.drawable.widget05,R.drawable.widget06,R.drawable.widget07,R.drawable.widget08,R.drawable.widget08};
	

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return mainNames.length;
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertview, ViewGroup arg2) {
		//gridView有bug因此该方法将被调用2*9次,占内存,为了提高效率。可以将icon_iv与icon_tv设置为静态变量
		View view=inflater.inflate(R.layout.mainscreen_item, null);//将资源文件填充为View对象
		 icon_iv=(ImageView) view.findViewById(R.id.icon_iv);
		icon_tv=(TextView) view.findViewById(R.id.icon_tv);
		icon_iv.setImageResource(mainPics[position]);//将图标的图片填入
		icon_tv.setText(mainNames[position]);//将图标的文本填入
		return view;
	}
	

}

  对gridView中的每个图标设置监听事件

gv.setOnItemClickListener(this);//对gridView中的每一个功能实现监听,需要Activity加监听接口

@Override
	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
		// TODO Auto-generated method stub
		switch (position) {
		case 0:
			Log.i(TAG, "进入手机防盗");
			break;

		default:
			break;
		}
	}

  对每个图标进行长按监听,当长按时弹出对话框,提供修改图标名称的功能

private SharedPreferences sp;//yonglai持久化数据

sp=this.getSharedPreferences("config", Context.MODE_PRIVATE);//将sharePreference初始化,生成config文件,访问模式为私有模式


gv.setOnItemLongClickListener(new OnItemLongClickListener() {//设置长按来更改图标名
			
			@Override
			public boolean onItemLongClick(AdapterView<?> parent, final View view,
					int position, long id) {
				if(position==0){
				final EditText et=new EditText(mainActivity.this);
				et.setHint("请输入你要更改的名称");
				new AlertDialog.Builder(mainActivity.this)
				.setTitle("更改标题")
				.setView(et)
				.setPositiveButton("确定",new DialogInterface.OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						String placedName=et.getText().toString().trim();
						if("".equals(placedName)){
							Toast.makeText(getApplicationContext(), "不能为空呀", 0).show();
							return;
						}else{
							Editor editor=sp.edit();//创建Editor对象写数据
							editor.putString("lost_name", placedName);//将数据写入
							editor.commit();//将数据提交
							TextView tv=(TextView)view.findViewById(R.id.icon_tv);
							tv.setText(placedName);	
						}
					}
				})
				.setNegativeButton("取消", null)
				.show();
				}
				
				return false;
			}
	
		});
			

  在适配器方法mainAdapter.java中进行更改

private SharedPreferences sp;
....
sp=context.getSharedPreferences("config", context.MODE_PRIVATE);
.....
@Override
	public View getView(int position, View convertview, ViewGroup arg2) {
		//gridView有bug因此该方法将被调用2*9次,占内存,为了提高效率。可以将icon_iv与icon_tv设置为静态变量
		View view=inflater.inflate(R.layout.mainscreen_item, null);//将资源文件填充为View对象
		 icon_iv=(ImageView) view.findViewById(R.id.icon_iv);
		icon_tv=(TextView) view.findViewById(R.id.icon_tv);
		icon_iv.setImageResource(mainPics[position]);//将图标的图片填入
		icon_tv.setText(mainNames[position]);//将图标的文本填入
		if(position==0){
			String name=sp.getString("lost_name", null);//拿出SharedPreferences中存入的值
			
			if(name!=null){
				icon_tv.setText(name);//将标图名设置为新值
			}
			
		}
		return view;
	}
	

  

原文地址:https://www.cnblogs.com/DASOU/p/3391380.html