(一) Android 开发基础

1 Android平台的特性

1)  应用程序框架支持组建的重用和替换,包括打电话应用程序、文件管理器等。

2)  Dalvik虚拟机专门为移动设备做了优化,Dalvik虚拟机是基于寄存器的,相对于Java虚拟机速度要快很多

3)  内部集成浏览器基于开源的WebKit引擎

4)  优化的图形库包括2D和3D图形库

5) SQLite用作结构化的数据存储 等

2 Android的体系结构

分为4层,由上而下依次是应用程序、应用程序框架、核心类库和Linux内核。

3 Android组件类

1)  Activity:一个Activity通常就是一个单独的屏幕,通过调用startActivity()方法可以从一个屏幕导航到另一个屏幕,打开Activity的条件被封装在Intent中。当一个新的屏幕打开后,前一个屏幕将会暂停,并保存在历史堆栈中。默认情况下,Android将会保留从主屏幕到每一个应用的运行屏幕。

2)  Service:一种长生命周期的、没有用户界面的程序,通过嗲用Context.startService()来启动一个Service,还可以通过使用Context.bindService()方法连接到一个Service上,连接之后,我们还可以通过Service提供的接口与它进行通信。

3)  Broadcast Receiver:为了实现系统广播而提供的一种组件。

4)  ContentProvider:用来实现不同组件之间数据的共享

5)  View:是Android中图形用户界面的基类。Android的图形界面展示可以分为三层:底层是Activity,上面是Window,再上面是Views.View又可以分为View(按钮、单选框、多选课等)和ViewGroup(布局控件)。

6)  Intent:不同组件之间相互导航的纽带,封装了不同组件之间导航查找的条件

4 Android开发

1)安装环境的配置:下载Android SDK、下载安装JDK、下载Eclipse、下载安装ADT

2)Android SDK下载包说明

add-ons   空目录保存Google插件工具

platforms  空目录保存不同版本SDK

tools  SDK工具

SDK Setup.exe    在线安装SDK的可执行文件

SDK Readme.txt   说明文件

3) adb常用命令

adb push  本地路径  远程路径   , 例 D:\>adb push d:\test.apk   /sdcard/     将D盘根目录下的text.txt文件复制到设备的sdcard里面远程路径本地路径

adb pull     远程路径  本地路径 , 例 D:\>adb pull  /sdcard/test.apk  d:\    将sdcard里的text.txt复制到D盘根目录下

adb install  test.apk  安装程序

adb shell  允许使用系统中的各种命令,进入shell命令行之后,这里我们可以使用ls 来显示当前目录下的文件内容,可以使用cd来改变当前路径,也可以使用exit退出shell

4) 其他工具简介

Dalvik Debug Monitor Service(DDMS),即Dalvik调试监控服务,是一个可视化的调试监控工具。在DOS命令窗口中输入ddms就会弹出界面。主要是对系统运行后台日志的监控,还有系统线程、虚拟机状态的监控,另外还可以模拟发送短信、拨打电话和发送GDP位置信息

5 Android 应用程序结构

src    源文件文件夹(主要是完成java代码的编写)

gen  保存自动生成的R资源类文件夹;系统自动生成的源代码目录

R.java  工程自动生成的资源索引类,这个是系统自动生成的文件,非常的重要。这个R.java类默认有attr、drawable、layout、string 4个静态内部类,每个类对应一种资源。例如我们在工程中增加一幅图片,那么工程就会在此类的drawable内部类中增加一条数据,如果删除此图片,工程会自动删除此条数据。

assets   资源文件夹

res   资源文件夹(存图片、布局文件盒字符串、菜单等文件)

drawable  保存图片等资源文件夹,默认PNG格式

layout   存放界面布局文件,以.xml结束

layout->main.xml   界面布局文件

values  简单配置文件夹,存放很重要的strings.xml,除此之外还可以定义arrays.xml(用来定义数值)、color.xml(用来定义颜色和颜色字符串数值)、dimens.xml(用来定义尺寸数值)、styles.xml(用来定义样式)

values->strings.xml   字符串配置文件,存放的自定义的字符串和数值

AndroidManifest.xml  Android配置清单文件

是每个android程序必须的文件,它位于整个项目的根目录,描述了package中暴露的组件(activities,services等等),他们各自的实现类,各种能被处理的数据和启动位置,除了能声明程序中的Activities,ContentProviders,Services和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)

default.xml  属性文件

project.properties  工程属性文件配置

bin  输出文件夹,如生成的APK文件

-----------------------------------------------------------------------------------------------------------------------------------

文 件             取值方式

string.xml          getResource().getString(resourceId) 或者 getResource().getText(resourceId)

arrays.xml         getResource().getStringArray(resourceId)

color.xml           getResource().getDarwable(resourceId) 或者 getResource().getColor(resourceId)

dimens.xml        getResource().getDimension(resourceId)

styles.xml          不需要取值

------------------------------------------------------------------------------------------------------------------------------------

Activity生命周期的7个方法和3个阶段
7个方法如下:
void onCreate(Bundle savedInstanceState) 
void onStart() 
void onRestart() 
void onResume() 
void onPause() 
void onStop() 
void onDestroy()

Activity经历如下3个阶段:

开始Activity: 在这个阶段依次执行3个生命周期的方法,分别是onCreate、onStart和onResume方法。

Activity重新获得焦点:如果Activity重新获得焦点,会依次执行3个生命周期,分别是 onRestart、onStart和onResume

关闭Activity:当Activity被关闭时系统会依次执行3个生命周期方法,分别是:onPause、onStop和onDestory。

从以上的Activity的生命周期不难看出,该图包含了两层循环,第一层循环是onPauseonResumeonPause ;第二层循环是onStartonRestartonResumeonPauseonStop 。我们可以将这两层的循环看成整个Activity的生命周期的子生命周期 ,第一层循环称为是焦点生命周期,第二层循环可以视为生命周期。
也就是说,第一层循环在Activity焦点获得与失去的过程中循环,在这个过程中,Activity始终是可见的,第二层循环是Activity可见和不可见的过程中循环。
这个过程中伴随着Activity焦点的获得与失去,也就是说,Activity首先会被显示,然后会获得焦点,接着失去焦点,最后弹出其他的Activity
Activity具体的生命周期如下:
整体的生命周期:onCreate…..onDestory
可视生命周期:onStart…..onStop
焦点生命周期:onResumeonPause

------------------------------------------------------------------------------------------------------------------------------------

android中的数据传递

在Activity之间数据传递,还有一种比较实用的方式,就是全局对象;

在JAVA WEB的四个作用域中,这四个作用域从小到大分别是Page,Request,Session,Application,其中Application域在应用程序的任何地方都可以使用和访问,除非是WEB服务器停止,Android中的全局对象非常类似于JAVA WEB中的Application域,除非是Android应用程序清除内存,否则全局对象将一直可以访问。

------------------------------------------------------------------------------------------------------------------------------------

问题概述:

在run project 后提示如下错误:

“Error generating final archive: Debug Certificate expired ....”

原因分析:

android要求所有的程序必须有签名,否则就不会安装该程序。在我们开发过程中,adt使用debug keystore,在 preference->android->buid中设置。debug的keystore默认有效期为一年,如果你是从一年前开始完android程序,那么在一年后导入这个app的时候很可能出现debug keystore过期,导致你无法生成 apk文件。

此时你只要删除debug keystore就行,系统又会为你生成有效期为一年的私钥。

解决方法:

可在eclipse中查找此路径:Window->Preferences->Android->Build下 Default debug keystore

将该路径下的 debug.keystore和 ddms.cfg 删除,然后重新run即可。

--------------------------------------------------------------------------------------------------------------------------------------

常用方法

1.手机屏幕分辨率 

DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);

String strOpt = "手机屏幕分辨率为:" + dm.widthPixels + " × " + dm.heightPixel;

2.调用一个新的Activity,传递Bundle

/* new一个Intent对象,并指定要启动的class */ 
 Intent intent = new Intent(); 
 intent.setClass(EX03_09_1.this, EX03_09.class);

/*new一个Bundle对象,并将要传递的数据传入*/
 Bundle bundle = new Bundle();
  bundle.putDouble("height",height);
  bundle.putString("sex",sex); 
 /*将Bundle对象assign给Intent*/ 
  intent.putExtras(bundle); 
 /* 调用一个新的Activity */ startActivity(intent); 
 /* 关闭原本的Activity */ 
EX03_09_1.this.finish();

3. 取得Intent中的Bundle对象

/* 取得Intent中的Bundle对象 */
 Bundle bunde = this.getIntent().getExtras();
    
  /* 取得Bundle对象中的数据 */
  String sex = bunde.getString("sex");
  double height = bunde.getDouble("height");

4.选择窗口

new AlertDialog.Builder(EX03_20.this).setTitle(R.string.str_alert_title)
          .setItems(R.array.items_irdc_dialog,
              new DialogInterface.OnClickListener()
              {
                public void onClick(DialogInterface dialog, int whichcountry)
                {
                  CharSequence strDialogBody = getString(R.string.str_alert_body);
                  String[] aryShop = getResources().getStringArray(
                      R.array.items_irdc_dialog);
                  new AlertDialog.Builder(EX03_20.this).setMessage(
                      strDialogBody + aryShop[whichcountry]).setNeutralButton(
                      R.string.str_ok, new DialogInterface.OnClickListener()
                      {
                        public void onClick(DialogInterface dialog,
                            int whichButton)
                        { /* 在这里处理要作的事 */
                        }
                      }).show();
                }
              }).setNegativeButton("取消", new DialogInterface.OnClickListener()
          {
            @Override
            public void onClick(DialogInterface d, int which)
            {
              d.dismiss();
            }
          }).show();

5.显示Progress对话框

// 显示Progress对话框
      myDialog = ProgressDialog.show(EX03_19.this, strDialogTitle,
          strDialogBody, true);

6.调试信息的输出

Log.v(TAG, "This is a VERBOSE message");//输出冗余消息
        Log.d(TAG, "This is a DEBUG message");//输出调试消息
        Log.i(TAG, "This is an INFO message");//输出普通消息
        Log.w(TAG, "This is a WARNING message");//输出警告消息
        Log.e(TAG, "This is a ERROR message");//输出错误消息

-------------------------------------------------------------------------------------------------------------------------------------------

菜单使用例子

//初始化菜单,这个函数只会被被调用一次,在菜单第一次显示时调用,要想每次显示时都更新请参见 onPrepareOptionsMenu(Menu).
  public boolean onCreateOptionsMenu(Menu menu)
  {
    menu.add(0, 0, 0, R.string.app_about);
    menu.add(0, 1, 1, R.string.str_exit);
    return super.onCreateOptionsMenu(menu);
  }
  //描述当菜单选项被选择时,如何作响应
  public boolean onOptionsItemSelected(MenuItem item)
  {
    super.onOptionsItemSelected(item);
    switch(item.getItemId())
    {
      case 0:
        openOptionsDialog();
        break;
      case 1:
        finish();
        break;
    }
    return true;
  }
    //响应函数
  private void openOptionsDialog()
  {
    new AlertDialog.Builder(this)
    .setTitle(R.string.app_about)
    .setMessage(R.string.app_about_msg)
    .setPositiveButton(R.string.str_ok,
        new DialogInterface.OnClickListener()
        {
         public void onClick(DialogInterface dialoginterface, int i)
         {
         }
         }
        )
    .show();
  }

-----------------------------------------------------------------------------------------------------------------------------

常用例子代码

1.使用Toast  

/*使用系统标准的 makeText()方式来产生Toast讯息*/

Toast.makeText( EX04_03.this, "你的愿望 "+Str.toString()+"已送达耶诞老人信箱", Toast.LENGTH_LONG).show();

/*使用带图片的Toast*/

LinearLayout lay = new LinearLayout(EX05_07.this);
        /*设定mTextView去抓取string值*/ 
        mTextView.setText(R.string.app_url);  
        /*用Toast方式显示*/ 
        Toast toast = Toast.makeText(EX05_07.this, mTextView .getText(), Toast.LENGTH_LONG); 
        View textView = toast.getView(); 
        lay.setOrientation(LinearLayout.HORIZONTAL);
        /*在Toast里加上图片*/
        mView01.setImageResource(R.drawable.icon); 
        /*在Toast里显示图片*/ lay.addView(mView01); 
        /*在Toast里显示文字*/ lay.addView(textView); 
        toast.setView(lay);
        toast.show();

2.拨打电话

/*建构一个新的Intent并执行action.CALL的常数与透过Uri将字符串带入*/
Intent myIntentDial = new Intent("android.intent.action.CALL",Uri.parse("tel:"+strInput)); 
/*在startActivity()方法中带入自定义的Intent对象以执行拨打电话的工作*/ 
startActivity(myIntentDial);

  3.发短信

/*建构一取得default instance的 SmsManager对象 */ 
     SmsManager smsManager = SmsManager.getDefault(); 
    
 /* 先建构一PendingIntent对象并使用getBroadcast()方法进行Broadcast * 
 / * 将PendingIntent,电话,简讯文字等参数传入sendTextMessage()方法发送简讯*/ 
     PendingIntent mPI = PendingIntent.getBroadcast(EX05_03.this, 0, new Intent(), 0); 
     smsManager.sendTextMessage(strDestAddress, null, strMessage, mPI, null);

4.发邮件

/*透过Intent来发送邮件*/
     Intent mEmailIntent = 
    new Intent(android.content.Intent.ACTION_SEND); 
 /*设定邮件格式为plain/text*/
      mEmailIntent.setType("plain/text");
 /*取得EditText01,02,03,04的值作为收件人地址,附件,主题,内容*/
      strEmailReciver = new String[]{mEditText01.getText().toString()};
      strEmailCc = new String[]{mEditText02.getText().toString()};
      strEmailSubject = mEditText03.getText().toString();
      strEmailBody = mEditText04.getText().toString(); 
   /*将取得的字符串放入mEmailIntent中*/
      mEmailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, strEmailReciver); 
      mEmailIntent.putExtra(android.content.Intent.EXTRA_CC, strEmailCc);
      mEmailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, strEmailSubject);
      mEmailIntent.putExtra(android.content.Intent.EXTRA_TEXT, strEmailBody); 
      /*开启Gmail 并将相关参数传入*/ 
      startActivity(Intent.createChooser(mEmailIntent, getResources().getString(R.string.str_message)));

5.使用Notication

/* 建立新的Intent,作为点选Notification留言条时,
     * 会执行的Activity */ 
    Intent notifyIntent=new Intent(this,EX05_08_1.class);  
    notifyIntent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK);
    /* 建立PendingIntent作为设定递延执行的Activity */ 
    PendingIntent appIntent=PendingIntent.getActivity(EX05_08.this,0,
                                                      notifyIntent,0);
       
    /* 建立Notication,并设定相关参数 */ 
    Notification myNoti=new Notification();
    /* 设定statusbar显示的icon */
    myNoti.icon=iconId;
    /* 设定statusbar显示的文字讯息 */
    myNoti.tickerText=text;
    /* 设定notification发生时同时发出预设声音 */
    myNoti.defaults=Notification.DEFAULT_SOUND;
    /* 设定Notification留言条的参数 */
    myNoti.setLatestEventInfo(EX05_08.this,"MSN登入状态",text,appIntent);
    /* 送出Notification */
    myNotiManager.notify(0,myNoti);

6.横式直式切换

if(getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
          {
            /* 若当前为横式,则变更为直式显示 */
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
          }
          else if(getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
          {
            /* 若当前为直式,则变更为横式显示 */
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
          }

---------------------------------------------------------------------------------------------------------------------------------------------------

SQLite的简单实例

//实例类

public class ToDoDB extends SQLiteOpenHelper

{
  private final static String DATABASE_NAME = "todo_db";
  private final static int DATABASE_VERSION = 1;
  private final static String TABLE_NAME = "todo_table"; 
  public final static String FIELD_id = "_id";
  public final static String FIELD_TEXT = "todo_text"; 
  public ToDoDB(Context context) 
  { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); }
  @Override 
  public void onCreate(SQLiteDatabase db)
  {
    /* 建立table */ 
    String sql = "CREATE TABLE " 
      + TABLE_NAME + " (" + FIELD_id +
      " INTEGER primary key autoincrement, "
      + " " + FIELD_TEXT + " text)"; 
    db.execSQL(sql); 
    } 
  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
  { 
    String sql = "DROP TABLE IF EXISTS " 
      + TABLE_NAME; db.execSQL(sql);
      onCreate(db); 
      }
  public Cursor select() 
  { 
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);
    return cursor;
    }
  public long insert(String text)
  { 
    SQLiteDatabase db = this.getWritableDatabase();
    /* 将新增的值放入ContentValues */
    ContentValues cv = new ContentValues();
    cv.put(FIELD_TEXT, text);
    long row = db.insert(TABLE_NAME, null, cv); 
    return row; 
    } 
  public void delete(int id) 
  { 
    SQLiteDatabase db = this.getWritableDatabase();
    String where = FIELD_id + " = ?"; 
    String[] whereValue = { Integer.toString(id) };
    db.delete(TABLE_NAME, where, whereValue); 
    } 
  public void update(int id, String text) 
  { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    String where = FIELD_id + " = ?";
    String[] whereValue = { Integer.toString(id) }; 
    /* 将修改的值放入ContentValues */ 
    ContentValues cv = new ContentValues(); 
    cv.put(FIELD_TEXT, text); 
    db.update(TABLE_NAME, cv, where, whereValue); 
    }

}

----------------------------------------------------------------------------------------------------------------------------------------

监听短信接收实例

/* 自定义继承自BroadcastReceiver类,监听系统服务广播的信息 */
public class EX06_01_SMSreceiver extends BroadcastReceiver 

   /*声明静态字符串,并使用android.provider.Telephony.SMS_RECEIVED作为Action为短信的依据*/
  private static final String mACTION = "android.provider.Telephony.SMS_RECEIVED"; 
  
  @Override 
  public void onReceive(Context context, Intent intent) 
  { 
    // TODO Auto-generated method stub 
    /* 判断传来Intent是否为短信*/
    if (intent.getAction().equals(mACTION)) 
    { 
      /*建构一字符串集集合变量sb*/
      StringBuilder sb = new StringBuilder(); 
      /*接收由Intent传来的数据*/
      Bundle bundle = intent.getExtras(); 
      /*判断Intent是有资料*/
      if (bundle != null) 
      { 
        /* pdus为 android内建短信参数 identifier
         * 透过bundle.get("")并传一个包含pdus的对象*/
        Object[] myOBJpdus = (Object[]) bundle.get("pdus"); 
        /*建构短信对象array,并依据收到的对象长度来建立array的大小*/
        SmsMessage[] messages = new SmsMessage[myOBJpdus.length];  
        for (int i = 0; i<myOBJpdus.length; i++) 
        {  
          messages[i] = SmsMessage.createFromPdu ((byte[]) myOBJpdus[i]);  
        } 
          
        /* 将送来的短信合并自定义信息于StringBuilder当中 */  
        for (SmsMessage currentMessage : messages) 
        {  
          sb.append("接收到来告:\n");  
          /* 来讯者的电话号码 */ 
          sb.append(currentMessage.getDisplayOriginatingAddress());  
          sb.append("\n------传来的短信------\n");  
          /* 取得传来讯息的BODY */  
          sb.append(currentMessage.getDisplayMessageBody());  
        }  
      }    
      /* 北Notification(Toase)显示短信信息  */
      Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show(); 
       
      /* 返并加Activity */ 
      Intent i = new Intent(context, EX06_01.class); 
      /*设定让加Activity以一个新的task来执行*/
      i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(i); 
    } 
  } 
--------------------------------------------------------------------------------------------------------------------------------------------
Service的简单使用例子
/* 建构Intent对象,指定开启对象为mService1服务 */
        Intent i = new Intent( EX06_04.this, mService1.class );
        
        /* 设定新TASK的方式 */
        i.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
        
        /* 以startService方法启动Intent */

startService(i);

/* 构造Intent对象,指定欲关闭的对象为mService1服务 */
        Intent i = new Intent( EX06_04.this, mService1.class );
        
        /* 以stopService方法关闭Intent */
        stopService(i);

---------------------------------------------------------------------------------------------------------------------------------------------

监听电话的例子

/* 内部class继承PhoneStateListener */
  public class exPhoneCallListener extends PhoneStateListener
  {
    /* 重写onCallStateChanged当状态改变时改变myTextView1的文字及颜色 */
    public void onCallStateChanged(int state, String incomingNumber)
    {
      switch (state)
      {
        /* 无任务状态时 */
        case TelephonyManager.CALL_STATE_IDLE:
          myTextView1.setTextColor(getResources().getColor(R.drawable.red));
          myTextView1.setText("CALL_STATE_IDLE");
          break;
        /* 接起电话时 */
        case TelephonyManager.CALL_STATE_OFFHOOK:
          myTextView1.setTextColor(getResources().getColor(R.drawable.green));
          myTextView1.setText("CALL_STATE_OFFHOOK");
          break;
        /* 电话进来时 */
        case TelephonyManager.CALL_STATE_RINGING:
          getContactPeople(incomingNumber);
          break;
        default:
          break;
      }
      super.onCallStateChanged(state, incomingNumber);
    }

}

///////////////////////////////////////////////////////////////////////////////////////////////////

/* 新增的PhoneStateListener */
    exPhoneCallListener myPhoneCallListener = new exPhoneCallListener();
    /* 取得电话服务 */
    TelephonyManager tm = (TelephonyManager) this
        .getSystemService(Context.TELEPHONY_SERVICE);
    /* 注册Listener */
    tm.listen(myPhoneCallListener, PhoneStateListener.LISTEN_CALL_STATE);

-------------------------------------------------------------------------------------------------------------------------------------------------------

查看SD card使用情况的例子

 /* 判断记忆卡是否插入 */
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
    { 
      /* 取得SD CARD档案路径一般是/sdcard */
      File path = Environment.getExternalStorageDirectory(); 
      /* StatFs看文件系统空间使用状况 */
      StatFs statFs = new StatFs(path.getPath());
      /* Block的size */
      long blockSize = statFs.getBlockSize(); 
      /* 总Block数量 */ 
      long totalBlocks = statFs.getBlockCount(); 
      /* 已使用的Block数量 */
      long availableBlocks = statFs.getAvailableBlocks(); 
      String[] total = fileSize(totalBlocks * blockSize); 
      String[] available = fileSize(availableBlocks * blockSize);
      /* getMax取得在main.xml里ProgressBar设定的最大值 */
      int ss = Integer.parseInt(available[0]) * myProgressBar.getMax() / Integer.parseInt(total[0]); 
      myProgressBar.setProgress(ss); 
      String text = "总共" + total[0] + total[1] + "\n"; text += "可用" + available[0] + available[1]; 
      myTextView.setText(text); } 
    else if (Environment.getExternalStorageState().equals( Environment.MEDIA_REMOVED))
    { 
      String text = "SD CARD已移除"; myTextView.setText(text); 
      }
    } 
------------------------------------------------------------------------------------------------------------------------------
文件存取简单例子

/* 将值写入文件mc.ini*/

boolean isExit = true;

FileOutputStream fos = null;
    try
    {
      openFileInput(fileName);
    } catch (FileNotFoundException e)
    {
      isExit = false;
    }
    if (!isExit)
    {
      try
      {
        fos = openFileOutput(fileName, MODE_WORLD_WRITEABLE);
        BufferedOutputStream bos = new BufferedOutputStream(fos);

/* 系统日期为上次MC第一天的日期 */
        mcdate_value = DateUtil.getDateTime("yyyyMMdd", System
            .currentTimeMillis());
        String txt = mcdate_key + "=" + mcdate_value;
        bos.write(txt.getBytes());
        /* 周期为28天 */
        bos.write(new String("\n").getBytes());
        txt = period_key + "=" + period_value;
        bos.write(txt.getBytes());
        /* 提醒时间为中午12点 */
        bos.write(new String("\n").getBytes());
        txt = remind_key + "=" + remind_value;
        bos.write(txt.getBytes());

bos.close();
        fos.close();

} catch (FileNotFoundException e)
      {
        e.printStackTrace();
      } catch (IOException e)
      {
        e.printStackTrace();
      }
    }
    /* 将文件mc.ini里的值取出 */
    Properties p = new Properties();
    try
    {
      p.load(openFileInput(fileName));
      mcdate_value = p.getProperty(mcdate_key);
      period_value = p.getProperty(period_key);
      remind_value = p.getProperty(remind_key);
    } catch (FileNotFoundException e)
    {
      e.printStackTrace();
    } catch (IOException e)
    {
      e.printStackTrace();

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

try {
// 创建文件
file = new File(FILE_PATH, FILE_NAME);
file.createNewFile();

// 打开文件file的OutputStream
out = new FileOutputStream(file);
String infoToWrite = "我是即将要写入文件的内容";

// 将字符串转换成byte数组写入文件
out.write(infoToWrite.getBytes());
// 关闭文件file的OutputStream
out.close();

// 打开文件file的InputStream
in = new FileInputStream(file);
// 将文件内容全部读入到byte数组
int length = (int) file.length();
byte[] temp = new byte[length];
in.read(temp, 0, length);

// 将byte数组用UTF-8编码并存入display字符串中
display = EncodingUtils.getString(temp, TEXT_ENCODING);
// 关闭文件file的InputStream
in.close();
} catch (IOException e) {
// 将出错信息打印到Logcat
Log.e(TAG, e.toString());
this.finish();
}

-------------------------------------------------------------------------------------------------------------------------------------------------

QR Code条形码的产生

 /* 自定义生成QR Code的函数 */
  public void AndroidQREncode(String strEncoding, int qrcodeVersion)
  {
    try
    {
      /* 建构QRCode编码对象 */
      com.swetake.util.Qrcode testQrcode = new com.swetake.util.Qrcode();
      /* L','M','Q','H' */
      testQrcode.setQrcodeErrorCorrect('M');
      /* "N","A" or other */
      testQrcode.setQrcodeEncodeMode('B');
      /* 0-20 */
      testQrcode.setQrcodeVersion(qrcodeVersion);
      
      // getBytes
      byte[] bytesEncoding = strEncoding.getBytes("utf-8");
      
      if (bytesEncoding.length>0 && bytesEncoding.length <120)
      {
        /* 将字符串透过calQrcode函数转换成boolean数组 */
        boolean[][] bEncoding = testQrcode.calQrcode(bytesEncoding);
        /* 依据编码后的boolean数组,绘图 */
        drawQRCode(bEncoding, getResources().getColor(R.drawable.black));
      }
    }
    catch (Exception e)
    {
      Log.i("HIPPO", Integer.toString(mEditText01.getText().length()) );
      e.printStackTrace();
    }
  }
  
  /* 在SurfaceView上绘制QRCode图片 */
  private void drawQRCode(boolean[][] bRect, int colorFill)
  {
    /* test Canvas*/
    int intPadding = 20;
    
    /* 欲在SurfaceView上绘图,需先lock锁定SurfaceHolder */
    Canvas mCanvas01 = mSurfaceHolder01.lockCanvas();
    
    /* 设定画布绘制颜色 */
    mCanvas01.drawColor(getResources().getColor(R.drawable.white));
    
    /* 建立画笔 */
    Paint mPaint01 = new Paint();
    
    /* 设定画笔颜色及样式 */
    mPaint01.setStyle(Paint.Style.FILL);
    mPaint01.setColor(colorFill);
    mPaint01.setStrokeWidth(1.0F);
    
    /* 逐一加载2维boolean数组 */
    for (int i=0;i<bRect.length;i++)
    {
      for (int j=0;j<bRect.length;j++)
      {
        if (bRect[j][i])
        {
          /* 依据数组值,绘出条形码方块 */
          mCanvas01.drawRect(new Rect(intPadding+j*3+2, intPadding+i*3+2, intPadding+j*3+2+3, intPadding+i*3+2+3), mPaint01);
        }
      }
    }
    mSurfaceHolder01.unlockCanvasAndPost(mCanvas01);
  }
  
-----------------------------------------------------------------------------------------------------------------------------------------------------
Http Get使用简单例子
public String get(String url) throws Exception {

HttpClient client = new DefaultHttpClient();

HttpGet get = new HttpGet(url);

HttpResponse response = client.execute(get);

HttpEntity entity = response.getEntity();

// 尝试读取entity的长度,返回-1表示长度未知

long length = entity.getContentLength();

InputStream is = entity.getContent();

String s = null;
if (is != null) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] buf = new byte[512];

int ch = -1;
int count = 0;

while ((ch = is.read(buf)) != -1) {

baos.write(buf, 0, ch);

count += ch;

}

Log.e("HttpTask", "length=" + baos.toByteArray().length);
// 返回内容
s = new String(baos.toByteArray());
}
return s; 
}

-------------------------------------------------------------------------------------------------------------------------------------------------

【Android学习日记】的更多相关文章

  1. android学习日记05--Activity间的跳转Intent实现

    Activity间的跳转 Android中的Activity就是Android应用与用户的接口,所以了解Activity间的跳转还是必要的.在 Android 中,不同的 Activity 实例可能运 ...

  2. android学习日记03--常用控件Dialog

    常用控件 9.Dialog 我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框 对话框,要创建对话框之前首先要创建Bui ...

  3. android学习日记03--常用控件checkbox/radiobutton

    常用控件3.checkbox 复选框,确定是否勾选,点击一下勾选,点击第二下取消,当有一系列备选项时适合用checkbox控件,方便用户提交数据. 贴上例子Activity的java代码 packag ...

  4. android学习日记03--常用控件button/imagebutton

    常用控件 控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者.方法则是控件的一些简单而可见的功能.所有控件都是继承View类 介绍android原生提供几种常用的控件bu ...

  5. android学习日记20--连接组件之Intent和IntentFilter

    上次刚了解完Android的四大组件,现在学习组件间通信的Intent和IntentFilter 一.Intent 1.简述 Intent(意图)在应用程序运行时连接两个不同组件,是一种运行时的绑定机 ...

  6. android学习日记0--开发需要掌握的技能

    一.开发android,我们需要哪些技能基础 1.Java基础知识 2.Linux基础知识 3.数据库基础知识 4.网络协议 5.Android基础知识 6.服务器端开发知识 1.Java基础知识 很 ...

  7. android学习日记06--View视图

    一.android 界面开发 1.三个重要的类:View视图.Canvas画布.Paint画笔2.android 界面开发常用三种视图 View            --只能在主线程中更新,没有缓存 ...

  8. android学习日记02--Activity简介

    一.Activity活动 学习Android,第一个都会接触Activity滴,Activity表示一个用户界面,是Android应用程序的入口,可以同时有多个界面,但只会显示栈顶的界面. Activ ...

  9. Android学习日记

    1.[2013-10-03 13:45:38 - FileManager] res\drawable-xxhdpi\FileManager.jpg: Invalid file name: must c ...

随机推荐

  1. 课堂所讲整理:HTML--5JavaScript简介

    一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...

  2. Linux查找文件

    which 可以查找可执行文件的位置 evilxr@IdeaPad:~$ which ping /bin/ping whereis whereis -m 可查询到命令的帮助文档在什么地方 evilxr ...

  3. 英语语法最终珍藏版笔记-6“情态动词+have+ done”的含义

    “情态动词+have+ done”的含义 1.Must have done的含义.“must have+过去分词”表示对过去的推测,意思是“一定已经,想必已经,准是已经….”,只用于肯定句中.例如: ...

  4. Java跟C.C++相互调用

    //由于诸多误解,我对函数注解说明下,这2个参数谁才是真正的皇帝,谁代替谁了//首先.这个函数是我自己为说明问题写的,由于和头文件写在一起,故此加入这个宏,//不然c++编译器报告类型不对,你懂得// ...

  5. 嵌入式Linux C笔试题积累(转)

    http://blog.csdn.net/h_armony/article/details/6764811 1.   嵌入式系统中断服务子程序(ISR) 中断是嵌入式系统中重要的组成部分,这导致了很 ...

  6. phonegap 附件下载及打开附件

    出处:http://my.oschina.net/u/1011854/blog/169434 再次 谢谢作者! 在开发web app并且使用phonegap的情况下,附件下载着实是一件令人头疼的事,什 ...

  7. EntityValidationErrors

    关于如何查看 EntityValidationErrors 详细信息的解决方法 我们在 EF 的编程中,有时候会遇到这样一个错误: 但是,按照他的提示 "See 'EntityValidat ...

  8. unity, 由5.2.1f1升级到5.3.5f1,2d物理不正常解法

    由5.2.1f1升级到5.3.5f1,物理不正常. 最后发现问题出在我的游戏中的下面一段代码:   Vector2 targetPosition=...;   Vector2 targetVeloci ...

  9. unity, 使导入的材质名与3dmax中一致

    在fbx的Import setting的model选项页中:

  10. TKinter之输入框

    输入框是 Entry,应用程序要取得用户的信息,输入框是必不可少的. 输入框比较重要的一个函数: get:返回值即输入框的内容 比如e是一个输入框,e['show']='*'就变成了密码框 小例子:用 ...