1. 程式人生 > >android藍芽聊天開發(3)四大元件案例

android藍芽聊天開發(3)四大元件案例

介面如圖:依次點選按鈕,在debug模式下啟動,通過Android studio的console後臺,可以看到system列印的 資訊

 

先點start new activity-->startService-->sendBroadCast-->sendBroadCast2-->stopService 

執行日誌為:

I/System.out: NewActivity已經啟動
I/System.out: 接收到資料:Hello from main activity.

I/System.out: onStartClicked
I/System.out: MyService:onCreate,服務啟動
I/System.out: MyService:onStartCommand,service每次都會呼叫的服務開始命令
V/AudioManager: playSoundEffect   effectType: 0
I/System.out: onSendClicked,系統呼叫sendBroadcast()方法,顯式發訊息
I/System.out: onReceive,接收到廣播發來的訊息

I/System.out: onSendClicked2,系統呼叫sendBroadcast()方法,隱式發訊息
I/zygote64: Compiler allocated 6MB to compile void android.view.ViewRootImpl.performTraversals()
I/zygote64: Do full code cache collection, code=125KB, data=108KB
I/zygote64: After code cache collection, code=113KB, data=75KB
V/AudioManager: playSoundEffect   effectType: 0
I/System.out: onStartClicked
I/System.out: MyService:onDestroy,服務銷燬

mainActivity:

package com.lmj.bluetoothchat;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;



public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onBtnClicked(View v){
        System.out.println("onBtnClicked");

        // 啟動一個新的畫面Activity
        // Intent是一個訊息物件,封裝有動作和資料
        // 顯式呼叫NewActivity
        Intent intent = new Intent(this, NewActivity.class);
        intent.putExtra("msg", "Hello from main activity.");

        startActivity(intent);
    }

    public void onStartClicked(View v){
        System.out.println("onStartClicked");
        // 啟動後臺服務
        // 服務長期後臺執行,除非,使用者顯式呼叫stopService來停止服務
        startService(new Intent(this, MyService.class));
    }

    public void onStopClicked(View v){
        System.out.println("onStartClicked");
        stopService(new Intent(this, MyService.class));
    }

    public void onSendClicked(View v){
        System.out.println("onSendClicked,系統呼叫sendBroadcast()方法,顯式發訊息");
        // 通過sendBroadCast傳送一個廣播
        // 顯式傳送
        sendBroadcast(new Intent(this, MyReceiver.class));
    }

    public void onSendClicked2(View v){
        System.out.println("onSendClicked2,系統呼叫sendBroadcast()方法,隱式發訊息");
        // 通過sendBroadCast傳送一個廣播
        // 隱式廣播需要指定一個匹配Action字串
        // 暗號
        sendBroadcast(new Intent("com.example.activitytransferdemo.ACTION"));
    }
}
MyService服務類:
package com.lmj.bluetoothchat;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;

// 服務一定要註冊到Manifest中去
public class MyService extends Service {
	private InnerReceiver receiver;
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		System.out.println("MyService:onCreate,服務啟動");


		// 動態註冊廣播接收器
		// 可用於在不同元件之間進行非同步通訊
		receiver = new InnerReceiver();
		// 意圖過濾(訊息過濾器),匹配隱式訊息
		IntentFilter filter = new IntentFilter("com.lmj.bluetoothchat.ACTION");
		registerReceiver(receiver, filter);
	}

	class InnerReceiver extends BroadcastReceiver {
		@Override
		public void onReceive(Context arg0, Intent arg1) {
			System.out.println("InnerReceiver:onReceive,接收到廣播發來的訊息");
		}
	}

	// 服務只要啟動一次,不管使用者呼叫多少次startService,都只要呼叫一次onCreate建立一個服務物件
	// 但是,每次呼叫 startService時,都會呼叫其onStartCommand方法
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		System.out.println("MyService:onStartCommand,service每次都會呼叫的服務開始命令");
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		System.out.println("MyService:onDestroy,服務銷燬");
		super.onDestroy();
		unregisterReceiver(receiver);
	}


	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return null;
	}

}

MyReceiver 廣播類(處理廣播的接收):

public class MyReceiver extends BroadcastReceiver {
	@Override
	public void onReceive(Context arg0, Intent arg1) {
		System.out.println("onReceive,接收到廣播發來的訊息");
	}
}

第二頁面測試類NewActivity:普及一下知識:

android有

四大元件:Activity、BroadcastReceive、Service、Content Provider ;

五大儲存: SharedPreferences、SDCard 、SQLite資料庫儲存資料、使用ContentProvider儲存資料、IO儲存 ;

六大布局 :LineartLayout 、FrameLayout 、TableLayout 、 RelativeLayout 、 AbsoluteLayout 、 GridLayout ;

七大生命週期 :onCrate 不可見不可互動、 onStart 可見不可互動 、 onResume 可見可互動 、 onPause 可見不可互動 、onStop  不可見不可互動 、 onDestory 銷燬了 、 onRestart 從不可見到可見 ;

八大基本資料型別 : short 短整型 、 int 整型 、 long 長整型 、 float 浮點型 、 char 字元型 、 boolean 布林型 、 byte 位元組型 
 

package com.lmj.bluetoothchat;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

// Android中的四大元件都需要註冊到Manifest檔案中
public class NewActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);

		// 設定螢幕上顯示的內容
		setContentView(R.layout.activity_seconde);

		System.out.println("NewActivity已經啟動");
		// 獲得當前Actiivty啟動的Intent物件
		Intent intent = getIntent();
		String msg = intent.getStringExtra("msg");
		System.out.println("接收到資料:" + msg);
	}
}

佈局檔案activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="60dp"
        android:onClick="onBtnClicked"
        android:text="Start New Activity" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button1"
        android:layout_centerHorizontal="true"
        android:onClick="onStartClicked"
        android:text="StartService" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button2"
        android:layout_centerHorizontal="true"
        android:onClick="onStopClicked"
        android:text="StopService" />

    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button3"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="75dp"
        android:onClick="onSendClicked"
        android:text="Send BroadCast" />

    <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="35dp"
        android:onClick="onSendClicked2"
        android:text="SendBroadcast2" />

</RelativeLayout>