2014年3月17日

Android─隱藏Action bar

如果在android 4.0以上的版本,我們想要隱藏Action bar
我們可以去專案目錄資料夾values-v14下的styles.xml加入

showHome|homeAsUp|showTitle
showHome|homeAsUp|showTitle
@android:color/transparent

如此則可以隱藏action bar

參考連結1
參考連結2

Android─控制螢幕休眠

當我們程式在執行某個片段的時候,我們想要螢幕不休眠,讓使用者可以看到我們所想要顯示的資訊,例如 轉帳中,程式移除中
我們可以透過下面的程式碼達到我們的要求

首先我們先宣告
PowerManager pm;
	PowerManager.WakeLock wakeLock;

之後在oncreate下,加入
pm = (PowerManager) getActivity().getSystemService(
				Context.POWER_SERVICE);
		wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, this.getClass()
				.getCanonicalName());

之後在你想要螢幕不休眠的地方加入
wakeLock.acquire();
//想做的動作

別忘了在做完程序時,加入
wakeLock.release();
不然整個activity都會處於不休眠的狀態下

2014年2月5日

Java ─ Array 基本概念

在Java中,= 運算子用於基本資料型態時,是 將值複製給變數,但當它用於物件時,則是將物件指定給參考名稱來參考,您也可以將同一個物件指定給兩個參考名稱,當物件的值藉由其中一個參考名稱變更 時,另一個參考名稱所參考到的值也會更動

public class AdvancedArray { 
    public static void main(String[] args) { 
        int[] refer = {, 2, 3, 4, 5}; 
        int[] cop1; 
        int[] cop2; 
 
        cop1 = refer; 
        cop2 = refer; 
       for(int i = 0; i ; cop1.length; i++) 
            System.out.print(cop1[i] + " "); 
        System.out.println(); 
 
        for(int i = 0; i ; cop2.length; i++) 
            System.out.print(cop2[i] + " "); 
        System.out.println();
 
        cop1[2] = 8; 
        for(int i = 0; i ; cop1.length; i++) 
            System.out.print(tmp1[i] + " "); 
        System.out.println(); 
 
        for(int i = 0; i ; cop2.length; i++) 
            System.out.print(tmp2[i] + " "); 
        System.out.println();
    } 
 }

執行結果:
1 2 3 4 5
1 2 3 4 5
1 2 8 4 5
1 2 8 4 5

上述的程式碼,三個陣列 refer、cop1、cop2都參考至同一個陣列物件,
所以當上述的程式碼透過cop2更改陣列第2個索引值時,也同時改變的refer、col1的值。

如果是想要copy陣列,而不是參考陣列
Java裡的System類別的靜態方法arraycopy(),提供了copy陣列的函式

System.arraycopy(來源, 起始索引, 目的, 起始索引, 複製長度);

範例程式碼如下
int[] arr1 = {1, 2, 3, 4, 5}; 
int[] arr2 = new int[5];
 
System.arraycopy(arr1, 0, arr2, 0, arr1.length); 

for(int i = 0; i < arr2.length; i++) 
      System.out.print(arr2[i] + " "); 
System.out.println();
執行結果: 1 2 3 4 5 

在Java 版本 1.6之後提供了另一個更方便的copy array函式
在Arrays類別底下提供copyOfRange這個method

Arrays.copyOfRange(src, from, to)

其中from和to分別代表陣列的索引值,換言之,「to-from」則是複製的個數。
int array1[] = {1,2,3,4,5};
int array2[];
array2 = Arrays.copyOfRange(array1, 1, 4);

則array2的內容會是{2,3,4}

參考網址1
參考網址2





Android─Service 如何關閉 Activity

步驟一

我們先在Activity裡面加入一個BroadcastReceiver class 我們命名為close_myself,在onReceive method 裡面加入收到廣播後要做的事情
這裡我們做的就是finsih(),讓activity自行關閉
private final BroadcastReceiver close_myself = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
              finish();                                   
        }
};

步驟二

我們可以在Activity在 oncreate 時先註冊 Broadcast 要接收的名稱─CloseExampleAct
當我們接收到CloseExampleAct,去執行close_myself這個BroadcastReceiver。

@Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_rtsp_server);
      registerReceiver(close_myself, new IntentFilter("CloseExampleAct"));
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}

步驟三

接著,你只需要在Service需要關閉Activity的地方加入下面的程式碼
sendBroadcast(new Intent("CloseExampleAct"));
Service就會送出CloseExampleAct廣播出去,有註冊的Activity收到後,就會做相對應的動作

參考網頁


Android ─ 開機時自動啟動Service

如果我們想要Service是android 一開機的時候就啟動,我們該如何操作呢

步驟 1.

Service按照正常宣告
import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
 
public class ServiceExample extends Service {
      @Override
      public IBinder onBind(Intent intent) {
            return null;
      }
 
      @Override
      public void onCreate() {
            super.onCreate();
                // do something when the service is created
      }

步驟2.

新增一個BroadcastReceiver 類別,在這個 class裡使用 onReceive() 這個方法,來接收Android系統開機時所發送的廣播
當我們收到Intent.ACTION_BOOT_COMPLETED這個廣播時,去Start ServiceExample 這支 Service。
import android.content.Context;
import android.content.BroadcastReceiver;
import android.content.Intent;
 
public class Receive_BootCompleted extends BroadcastReceiver{
     @Override
     public void onReceive(Context context, Intent intent) {
        //we double check here for only boot complete event
        if(intent.getAction().equalsIgnoreCase(Intent.ACTION_BOOT_COMPLETED))
        {
           //here we start the service            
           Intent serviceIntent = new Intent(context, ServiceExample.class);
           context.startService(serviceIntent);
       }
    }
}

步驟3.

接著我們要在manifest宣告權限 use-permission,讓我們的BroadcastReceiver 可以有接收BOOT_COMPLETED 的權限



之後再宣告 Receiver 與 Service


      
            
      



根據這些步驟,service就可以在android開機時自動啟動

注意事項

在Android 3.1之後,如果Service沒有系統權限的情況下
是無法使用BOOT_COMPLETED的權限
如果要使用,必須在專案裡面增加一個Activity
此外在安裝到手持裝置時,還必須手動執行該app
如此Service才能開機時自動啟動

參考網址1
參考網址2
參考網址3



2014年1月8日

Android─透過adb發送BOOT_COMPLETED 啟動service

 
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED

透過上面的指令,就不用重開機器,就可以來測試BOOT_COMPLETED廣播
 
不過在我的開發機上測試 ,機器會重開....QQ
 
 

2013年11月14日

Android─spinner 下拉式選單基本用法

在Android開發app的時候,常需要做選單的選取。
但是在手機螢幕大小,無法讓我們將所有的選項都放進去螢幕中。
所以Android提供了Spinner widget,讓開發者可以在有限的畫面範圍內仍可放入所需的資料。

首先我們先在XMl檔放入兩個Spinner,一個是kind、另一個是name



     
    

    
    

    
    

     
    



在程式的功能是
在選擇kind spinner會改變 name spinner顯示的選項
在選取name 的spinner會跳出toast,show出選擇的名稱
程式碼如下
public class MainActivity extends Activity {
private ArrayAdapter listAdapter;
private ArrayAdapter nameAdapter;
private Spinner kind = null;
private Spinner name = null;
private String itemname[] = null;
//showtoast flag是用來判斷是否 name spinner有被選取
private boolean showtoast=false;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  initui();
  listAdapter = new ArrayAdapter(this, R.layout.spinnerlayout,
    new String[] { "肉類", "蔬菜", "水果" });
                //設定下拉式選單顯示的版面
  listAdapter.setDropDownViewResource(R.layout.spinner_dropdown);
                //設定kind spinner顯示的字串內容
  kind.setAdapter(listAdapter);
                //設定當kind spinner item選取後的動作
  kind.setOnItemSelectedListener(spinnerlistener);
 }

      //初始化UI function
      private void initui() {
  kind = (Spinner) findViewById(R.id.kind);
  name = (Spinner) findViewById(R.id.name);
 }

 AdapterView.OnItemSelectedListener spinnerlistener = new AdapterView.OnItemSelectedListener() {
  @Override
  public void onItemSelected(AdapterView adapterView, View view,
    int position, long id) {
                        //當選取的spinner是kind時
   if (adapterView.getId() == R.id.kind) {
                                 //判斷選取的種類是何種,設定相對應的字串陣列內容
    switch (adapterView.getSelectedItemPosition()) {
    case 0:
     itemname = new String[] { "牛肉", "豬肉", "雞肉" };
     break;
    case 1:
     itemname = new String[] { "白菜", "香菜", "高麗菜" };
     break;
    case 2:
     itemname = new String[] { "蘋果", "香蕉", "西瓜" };
     break;
    }
                                //當itemanme不為空時,對spinner name進行初始化
    if (itemname != null) {
     setnameitem();
    }
   } else if (adapterView.getId() == R.id.name) {
    if(showtoast!=false)
    {
    Toast.makeText(MainActivity.this,
      "您選擇" + adapterView.getSelectedItem().toString(),
      Toast.LENGTH_LONG).show();
    }
    showtoast=true;
   }
  }
  @Override
  public void onNothingSelected(AdapterView arg0) {
  }
 };

 private void setnameitem() {
  showtoast=false;
  nameAdapter = new ArrayAdapter(this, R.layout.spinnerlayout,
    itemname);
  name.setAdapter(nameAdapter);
  name.setOnItemSelectedListener(spinnerlistener);
 }
}

設定Spinner顯示字體格式 spinnerlayout.xml 程式碼如下



設定Spinner下拉式選單版面格式 spinner_dropdown.xml 程式碼如下



程式畫面如下;



參考資料
http://xapps.cc/article/280
http://jim690701.blogspot.tw/2012/11/androidspinner.html
http://stackoverflow.com/questions/4923310/android-spinner-onitemselected-setonitemselectedlistener-not-triggering