目前分類:Android 開發 (30)

瀏覽方式: 標題列表 簡短摘要

轉自 http://www.cnblogs.com/xiaoluo501395377/p/3430542.html

本篇隨筆將講解一下Android的多線程的知識,以及如何通過AsyncTask機制來實現線程之間的通信。

一、Android當中的多線程

Felix 發表在 痞客邦 PIXNET 留言(1) 人氣()

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://liangruijun.blog.51cto.com/3061169/655014

    ToggleButton(開關按鈕)是Android系統中比較簡單的一個組件,是一個具有選中和未選擇狀態雙狀態的按鈕,並且需要為不同的狀態設置不同的顯示文本。

    ToggleButton常用的XML屬性

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

要做一個Service要先了解,service無法自己啟動,必須要靠startService()才能啟動。

同樣的啟動後也必須要使用stopService()關閉。

在這邊需要注意的有幾點

1) startService()

2) stopService()

3) AndroidManiFest.xml增加service權限


第一點為開啟service必要條件,當然你要new一個intent

所以就是:

Intent intent = new Intent(MainActivity.this,service_class.class);
startService(intent);

MainActivity為你目前的class,service_class則是另外開的java檔(那邊則是寫service做的事情)


第二點跟第一點很類似,只有差在start / stop的差別

Intent intent = new Intent(MainActivity.this,service_class.class);
stopService(intent);

第三點就是你需要在Android ManiFest.xml裡面新增權限

否則跑起來會有

"

Unable to start service Intent: not found

"
這樣的錯誤訊息出現

好了,總結上面 MainActivity該如何寫?

package com.example.service_nonui_demo;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(MainActivity.this,service_class.class);
startService(intent);
}
@Override
public void onPause(){
super.onPause();
Intent intent = new Intent(MainActivity.this,service_class.class);
stopService(intent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}

/**
 * A placeholder fragment containing a simple view.
 */
public static class PlaceholderFragment extends Fragment {

public PlaceholderFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
return rootView;
}
}

}

 

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

Service的種類

  

按運行地點分類:

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

之前提及過,啟動Service有兩種方式:startService 與 bindService。前者已經說過如何使用,所以,這篇貼子主要是關於 bind service的。 這裡所討論的是僅針對那些被綁定的service的,而那些既被startService() 又被 bindService() 的 service 不在此範圍內。

1 Bind Service就像是C/S架構中的服務端,其他組件(比如 Activity)綁定到它(通過 bindService()),可以向它發送請求,可以接受從它返回的響應,它甚至還提供了進程間通信(IPC)功能。

2 一個service要想能夠被其他組件綁定,那麼它的 onBind() 方法必須被實現,且必須返回一個 IBinder 對象,然後其他組件可以通過這個 IBinder 對象與該 service 進行通訊。

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

不管是何種Service,它默認都是在應用程序的主線程(亦即UI線程)中運行的。所以,如果你的Service將要運行非常耗時或者可能被阻塞的操作時,你的應用程序將會被掛起,甚至會出現ANR錯誤。為了避免這一問題,你應該在Service中重新啟動一個新的線程來進行這些操作。現有兩種方法共大家參考:

1 直接在Service的onStartCommand()方法中重啟一個線程來執行,如:

Java代碼  收藏代码

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

們有兩種方式(start與bind)啟動一個Service,每一種方式啟動的Service生命週期是不一樣的,這篇貼子主要寫的是 start service。

它的生命週期中只有三個階段:onCreate, onStartCommand(取代原來的onStart方法), onDestroy。如下圖:


Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

為了更好的管理Android應用的用戶界面裡的個組件,Android提供了佈局管理器,通過佈局管理器,Android應用的圖形用戶界面具有良好的平台無關性。這裡什麼叫平台的無關性呢?就是說不同手機。我們知道不同手機它們的屏幕的分辨率、尺寸並不完全相同,而Android的佈局管理器可以根據運行平台來調整組件的大小,而我們所需要做的就是選擇合適的佈局管理器。

 與Swing編程不同的是,Android的佈局管理器本身就是一個UI組件,所有的佈局管理器都是ViewGroup的子類:

 

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

在 Android 中,

你可以利用排版 View 的 addView 函數,

將動態產生的 View 物件加入到排版 View 中,

範例如下 :

 main.xml 部份內容
<LinearLayout
android:id="@+id/viewObj"

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

上一篇介紹過如何使用LinearLayout進行元件佈局,但是單靠一種排版方式,設計出來的介面並不豐富,所以Android也有提供其它的排版方式,本篇將介紹如何使用RelativeLayout(相對佈局)進行排版。其它的排版方式會陸陸續續的介紹!!

  • 使用RelativeLayout進行元件佈局

   跟上一篇不同的地方是將包覆元件的容器改成RelativeLayout,本範例使用一個RelativeLayout來包覆4個Button元件,並定義一些元件屬性完成元件佈局.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<Button
    android:id="@+id/Button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button1"
    />
<Button
    android:id="@+id/Button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button2"
    android:layout_below="@+id/Button1"
    android:layout_toRightOf="@+id/Button1"
    />
<Button
    android:id="@+id/Button3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button3"
    android:layout_toRightOf="@+id/Button2"
    android:layout_above="@+id/Button2"
    />
 <Button
    android:id="@+id/Button4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button4"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    />
</RelativeLayout>

 

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

 

 


Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

To fetch images on SD Card.Uri will be

android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI

onActivityResult method:

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

若Activity中的內容太多,或是ListView的項目超過畫面 可以在Activity加上捲軸

畫面上方加上

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

Bitmap b =BitmapFactory.decodeByteArray(imageAsBytes,0, imageAsBytes.length)
profileImage.setImageBitmap(Bitmap.createScaledBitmap(b,120,120,false));

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

按鈕在許多windows視窗應用程式中,是最常見的「控制項controls」,然而由按鈕所觸發的事件處理,稱之為Even Handler,只不過在android的世界裡,按鈕事件是由系統的Button.onClickListener所控制。 

小試身手小範例:

Activity中佈局一個Button,並設計這個按鈕的事件處理,當按下時就變更TextView的字。按鈕事件裡面被覆寫的onClick(View v)方法,此方法唯一的參數是View型態的變數v,這個變數所指的是來自父層(parent)中的ContentView,因此可透過「v.*」來改變父層view的狀態或屬性。

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

半透明<Button android:background="#e0000000" ... />
透明<Button android:background="#00000000" ... />


Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

在Eclipse中新增一個專案的時候,會出現下面這個精靈來設定應用程式的圖示。如果未來想要更改這個啟動圖示,可以照以下步驟進行。
launcher icons setup wizard


Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

ActionBar在Android 3.0 SDK中為平板引入,在4.0中也可以在phone中使用。在title中提供類似tab和菜單的效果,有三種形式:Tabbed action bar,list action bar和standard action bar,我們將在小例子中進行示範。

Home Icon

在Action Bar的最左邊,就是Home icon和標題的區域,如上圖紅圈內。在Home icon的左邊有一個返回的的左箭頭,通常我們點擊這個區域,將回到應用的主activity中。圖中的activity是通過主activity的菜單觸發,之前已經多次使用,不在重複。activity的layout很簡單,只有一個textview在LinearLayout中,其代碼如下:

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

1.px (pixels)像素 – 是像素,就是屏幕上實際的像素點單位。
 dip或dp (device independent pixels)設備獨立像素, 與設備屏幕有關。
 sp (scaled pixels — best for text size):類似dp, 主要處理字體的大小。

dpi(dot per inch):屏幕像素密度,每英吋多少像素

density:density表示每英吋有多少個顯示點(邏輯值),它的單位是dpi

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

以下程式碼將示範如何將Bitmap轉為指定格式的圖片並儲存至外部儲存裝置SDCard。


若要寫入SDCard,必須先將寫入外部儲存裝置的權限打開,於Android專案的AndroidMaifest.xml中加入以下敘述。

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()

1 2