2011年5月17日 星期二

Implicit Intent

Implicit intent為未指定切換目標的intent
當送出intent後, 系統會根據各個應用程式的intent filter去判斷哪個應用程式要接收
若有多個適合的目標則會讓使用者去選擇

一個intent有下列常用的屬性
1. action : 動作
2. category : 詳細的比對資訊
3. component : 指定特定的目標接受intent
4. data : URI
5. extra : 資料

下例就是建立一個intent
其action是"android.intent.action.MAIN"
而category是"android.intent.category.HOME"
category可以不設定, 也可以設定多個, 這就是為什麼是用addCategory()而不是用setCategory()!
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.HOME")

屬性設定完後送出, 透過intent filter的比對可找出是應用程式接收此intent
startActivity(intent);

在每個應用程式的AndroidManifest.xml
可看到intent filter的設定
下例就是一個intent filter
其action是"android.intent.action.MAIN"
而category是"android.intent.category.LAUNCHER"
action和category都可以設定多個


其中比對action時只要和filter其中一個action相同就算通過action的比對
而比對category時則是要和filter每個category都比對過才算通過category的比對

2011年4月25日 星期一

BroadcastReceiver

BroadcastReceiver為android中的一個application component
用途是接收系統中的broadcast訊息
一般來說可以寫在AndroidManifest.xml中即可
但是有些系統預設的broadcast訊息必須動態的跟系統註冊broadcastReceiver才能接收
例如screen on, screen off等等
以下就是一個可接受screen on, screen off的broadcastReceiver範例

1. 建立intent filter並設定其內容, 此例中可接收之intent為
    "android.intent.action.SCREEN_ON"和"android.intent.action.SCREEN_OFF"
    至於BroadcastReceiver的class宣告在下面第2點有說明
    最後用registerReceiver(receiver, filter)向系統註冊此broadcastReceiver
public void onCreate() 
{
    // code
 
    IntentFilter filter = new IntentFilter();
    filter.addAction("android.intent.action.SCREEN_ON");
    filter.addAction("android.intent.action.SCREEN_OFF");
 
    ScreenReceiver receiver = new ScreenReceiver();
 
    registerReceiver(receiver, filter);
}

2. 建立一個inner class繼承broadcastReceiver, 並override onReceive()方法
    藉由intent.getAction()取得接收到的intent即可進行對應的動作
public class ScreenReceiver extends BroadcastReceiver
{     
    @Override
    public void onReceive(Context context, Intent intent)
    {   
        if(intent.getAction().equals("android.intent.action.SCREEN_ON"))
        {   
            // code
        }
        else if(intent.getAction().equals("android.intent.action.SCREEN_OFF"))
        {
            // code    
        }
    }
}

2011年3月30日 星期三

使用SharedPreferences存取偏好設定

1. 儲存偏好設定
設定偏好設定檔以及Editor
int number = 100;
SharedPreferences preferences = getSharedPreferences("PREFERENCE", 0);
SharedPreferences.Editor preferencesEditor = preferences.edit();
使用SharedPreferences.Editor的putInt()方法紀錄整數資料
前面的參數是key value,後面的參數是欲存放之資料
(若要存String則用putString(),其他依此類推...)
等到commit()才會將資料寫回偏好設定檔
preferencesEditor.putInt("myNumber", number);
preferencesEditor.commit();
這樣便將資料寫入偏好設定擋了

2. 取得偏好設定
使用相同的偏好設定檔,這邊不用使用Editor
接下來使用SharedPreferences的getInt()方法取得整數資料
前面的參數是key value,後面的參數則為預設值
(若要取String則用getString(),其他依此類推...)
SharedPreferences preferences = getSharedPreferences("PREFERENCE", 0);
data = preferences.getInt("myNumber", -1);
這樣就能從對應的key value中找出儲存的資料了

2011年3月11日 星期五

使用DateFormat處理時間型別

(1) 根據DateFormat將字串轉成時間 :
String dateString = "03-12 09:30:59";
SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd hh:mm:ss");
Date date = dateFormat.parse(dateString);
(2) 或是由系統取得時間 :
Date date = new Date();
如果要將時間顯示出來,可將時間轉成DateFormat再轉成字串 :
DateFormat.format("MM-dd hh:mm:ss", date).toString();

2011年3月3日 星期四

ActivityGroup中bindService的使用問題

一般的bindService:
private ServiceConnection serviceConnection = new ServiceConnection()
{
    public void onServiceConnected(ComponentName componentName,IBinder service)
    {
        // code
    }
    public void onServiceDisconnected(ComponentName componentName)
    {
        // code
    }
};

public void onCreate(Bundle savedInstanceState)
{
    ComponentName componentName = new ComponentName(this,test.class);
    Intent intent = new Intent();
    intent.setComponent(componentName);
    bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE);
}
若此class為ActivityGroup中的child activity(如:tabhost)則會無法順利bindService
此時解決方法就是用getApplicationContext().bindService()取代bindService(),如下:
getApplicationContext().bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE);

Explicit Intent

Explicit intent為明確指定欲切換目標的intent
基本上只要有設定intent的componentName就是Explicit intent
系統會選定componentName的內容做為切換intent的目標
而不去考慮其他的項目(像是action)


1. 設定componentName的內容
(1) 用於同一個package的intent :
ComponentName componentName = new ComponentName(this, TestActivity.class); // 不用指定package
(2) 可用於不同package的intent : (前面是package name, 後面是應用程式的component)
ComponentName componentName = new ComponentName("com.test", "com.test.TestActivity"); // 指定package


2. 指定intent的componentName
Intent intent = new Intent();
intent.setComponent(componentName);


3. 用intent切換到指定的Activity或是Service
(1) Avtivity
startActivity(intent);
(2) Service
startService(intent);

2011年2月28日 星期一

如何取得logcat

1. 執行相關指令
Runtime.getRuntime().exec("su");
Process p = Runtime.getRuntime().exec("logcat -d -v raw ActivityManager:I *:S");


2. 用串流接收列出來的訊息
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);


3. 讀取串流的資料,像是用readLine()
while((line=br.readLine())!=null)
{
    // code
}

2011年2月26日 星期六

SyntaxHighlighter

若要使用SyntaxHighlighter在網誌中顯示程式碼 :
設定->修改HTML
在<head></head>間加入:

<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'></script>
<script language='javascript'>
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf';
SyntaxHighlighter.all();
</script>

欲放入程式碼的位置:

<pre class="brush: 你要highlight的語言">
   your code
</pre>

語言清單可參考官網 :
http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/

結果:
your code