系出名门Android(4) - 活动(Activity), 服务(Service), 广播(Broadcast), 广播接收 器(BroadcastReceiver)

来源:互联网 发布:手机淘宝分类不能 编辑:程序博客网 时间:2024/03/28 17:57

系出名门Android(4) - 活动(Activity), 服务(Service), 广播(Broadcast), 广播接收 

器(BroadcastReceiver)【收藏】

作者:webabcd

介绍 
在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver 
活动(Activity) - 用于表现功能   
服务(Service) - 相当于后台运行的 Activity  
广播(Broadcast) - 用于发送广播   
广播接收器(BroadcastReceiver) - 用于接收广播  
Intent - 用于连接以上各个组件,并在其间传递消息   
1、演示 Activity 的基本用法,⼀个 Activity 启动另⼀个 Activity,启动另⼀个 Activity 时为其传递 
参数,被启动的 Activity 返回参数给启动者的 Activity 
Main.java 
代码 
package com.webabcd.activity; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
public class Main extends Activity { 
     
    TextView txt; 
     
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        this.setContentView(R.layout.main); 
        txt = (TextView) this.findViewById(R.id.txt); 
        txt.setText("Activity 1"); 
        Button btn = (Button) this.findViewById(R.id.btn); 
        btn.setText("启动另⼀个Activity"); 
        btn.setOnClickListener(new Button.OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                 
                // 实例化 Intent,指定需要启动的 Activity 
                Intent intent = new Intent(); 
                intent.setClass(Main.this, MyActivity.class); 
                // 实例化 Bundle,设置需要传递的参数 
                Bundle bundle = new Bundle(); 
                bundle.putString("name", "webabcd"); 
                bundle.putDouble("salary", 100.13); 
                // 将需要传递的参数赋值给 Intent 对象 
                intent.putExtras(bundle); 
                // startActivity(intent); // 启动指定的 Intent(不等待返回结果) 
                // Main.this.finish(); 
                 
                // 启动指定的 Intent,并等待返回结果 
                // 其中第二个参数如果大于等于零,则返回结果时会回调 onActivityResult() 方法 
                startActivityForResult(intent, 0); 
            } 
        }); 
         
        Log.d("MyDebug", "onCreate"); 
    } 
     
    // 被启动的 Activity 返回结果时的回调函数 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
        if (resultCode == Activity.RESULT_OK){ 
            Bundle bundle = data.getExtras(); 
             
            String name = bundle.getString("name"); 
            double salary = bundle.getDouble("salary"); 
             
            txt.setText("Activity 1" + "\n名字:" + name + "\n薪水:" + String.valueOf(salary)); 
        } 
    } 
    @Override 
    protected void onStart() { 
        // TODO Auto-generated method stub 
        super.onStart(); 
         
        Log.d("MyDebug", "onStart"); 
    } 
    @Override 
    protected void onStop() { 
        // TODO Auto-generated method stub 
        super.onStop(); 
         
        Log.d("MyDebug", "onStop"); 
    } 
    @Override 
    protected void onRestart() { 
        // TODO Auto-generated method stub 
        super.onRestart(); 
         
        Log.d("MyDebug", "onRestart"); 
    } 
     
    @Override 
    protected void onPause() { 
        // TODO Auto-generated method stub 
        super.onPause(); 
         
        Log.d("MyDebug", "onPause"); 
    } 
    @Override 
    protected void onResume() { 
        // TODO Auto-generated method stub 
        super.onResume(); 
         
        Log.d("MyDebug", "onResume"); 
    } 
     
    @Override 
    protected void onDestroy() { 
        // TODO Auto-generated method stub 
        super.onDestroy(); 
         
        Log.d("MyDebug", "onDestroy"); 
    } 

MyActivity.java 
代码 
package com.webabcd.activity; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
// 被另⼀个 Activity 所启动的 Activity 
public class MyActivity extends Activity { 
     
    Intent intent; 
     
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        this.setContentView(R.layout.main2); 
        // 获取启动者传递过来的参数 
        intent = this.getIntent(); 
        Bundle bundle = intent.getExtras();         
        String name = bundle.getString("name"); 
        double salary = bundle.getDouble("salary"); 
         
        TextView txt = (TextView) this.findViewById(R.id.txt); 
        txt.setText("Activity 2" + "\n名字:" + name + "\n薪水:" + String.valueOf(salary)); 
        Button btn = (Button) this.findViewById(R.id.btn); 
        btn.setText("返回前⼀个Activity"); 
        btn.setOnClickListener(new Button.OnClickListener() { 
            public void onClick(View v) { 
                // 返回参数给启动者 
                MyActivity.this.setResult(Activity.RESULT_OK, intent); 
                MyActivity.this.finish(); 
            } 
        }); 
    } 

AndroidManifest.xml 
代码 
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.webabcd.activity" android:versionCode="1" 
    android:versionName="1.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
        <activity android:name=".Main" android:label="@string/app_name"> 
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
        </activity> 
        <!--            如果有需要用到的 Activity ,则都要在这里做相应的配置 
        --> 
        <activity android:name=".MyActivity" android:label="Activity 2" /> 
    </application> 
    <uses-sdk android:minSdkVersion="3" /> 
</manifest>  
2、Service, Broadcast, BroadcastReceiver 的演示 
Main.java 
代码 
package com.webabcd.service; 
import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.content.ServiceConnection; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.TextView; 
/* 
 * startService() 和 bindService() 的区别  
 * startService() - 正常理解就好 
 * bindService() - 使当前上下文对象(本例中就是 Activity)通过⼀个 ServiceConnection 对象邦定 
到指定的 Service 。这样,如果上下文对象销毁了的话,那么其对应的 Service 也会被销毁 
 */ 
public class Main extends Activity implements OnClickListener { 
    private TextView txtMsg; 
     
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        setTitle("android 之 service"); 
        this.findViewById(R.id.btnStart).setOnClickListener(this); 
        this.findViewById(R.id.btnStop).setOnClickListener(this); 
        this.findViewById(R.id.btnBind).setOnClickListener(this); 
        this.findViewById(R.id.btnUnbind).setOnClickListener(this); 
         
        txtMsg = (TextView)this.findViewById(R.id.txtMsg); 
         
        // 实例化自定义的 BroadcastReceiver 
        receiver = new UpdateReceiver(); 
        IntentFilter filter = new IntentFilter(); 
        // 为 BroadcastReceiver 指定 action ,使之用于接收同 action 的广播 
        filter.addAction("com.webabcd.service.msg"); 
         
        // 以编程方式注册  BroadcastReceiver 。配置方式注册 BroadcastReceiver 的例 
子见 AndroidManifest.xml 文件 
        // ⼀般在 OnStart 时注册,在 OnStop 时取消注册 
        this.registerReceiver(receiver, filter); 
        // this.unregisterReceiver(receiver); 
         
    } 
    @Override 
    public void onClick(View v) { 
        Intent intent = new Intent(Main.this, MyService.class); 
        switch (v.getId()) { 
        case R.id.btnStart: 
            this.startService(intent); 
            break; 
        case R.id.btnStop: 
            this.stopService(intent); 
            break; 
        case R.id.btnBind: 
            this.bindService(intent, conn, Context.BIND_AUTO_CREATE); 
            break; 
        case R.id.btnUnbind: 
            this.unbindService(conn); 
            break; 
        } 
    } 
    // bindService() 所需的 ServiceConnection 对象 
    private ServiceConnection conn = new ServiceConnection() { 
        @Override 
        public void onServiceConnected(ComponentName className, IBinder service) { 
             
        } 
        @Override 
        public void onServiceDisconnected(ComponentName className) { 
             
        } 
    }; 
     
    private String msg=""; 
    private UpdateReceiver receiver; 
    // 实现⼀个 BroadcastReceiver,用于接收指定的 Broadcast 
    public class UpdateReceiver extends BroadcastReceiver{ 
        @Override 
        public void onReceive(Context context, Intent intent) { 
            msg = intent.getStringExtra("msg"); 
             
            txtMsg.append(msg + "\n"); 
        } 
         
    } 

MyService.java 
代码 
package com.webabcd.service; 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.util.Log; 
// 演示 Service 的生命周期。具体信息运行程序后在 LogCat 中查看 
public class MyService extends Service { 
    @Override 
    public IBinder onBind(Intent intent) { 
         
        Log.d("MyDebug", "onBind"); 
        sendMsg("onBind"); 
         
        // TODO Auto-generated method stub 
        return null; 
    } 
    @Override 
    public void onCreate() { 
        // TODO Auto-generated method stub 
        super.onCreate(); 
         
        Log.d("MyDebug", "onCreate"); 
        sendMsg("onCreate"); 
    } 
    @Override 
    public void onDestroy() { 
        // TODO Auto-generated method stub 
        super.onDestroy(); 
         
        Log.d("MyDebug", "onDestroy"); 
        sendMsg("onDestroy"); 
    } 
    @Override 
    public void onRebind(Intent intent) { 
        // TODO Auto-generated method stub 
        super.onRebind(intent); 
         
        Log.d("MyDebug", "onRebind"); 
        sendMsg("onRebind"); 
    } 
    @Override 
    public void onStart(Intent intent, int startId) { 
        super.onStart(intent, startId); 
         
        Log.d("MyDebug", "onStart"); 
        sendMsg("onStart"); 
    } 
     
    @Override 
    public boolean onUnbind(Intent intent) { 
         
        Log.d("MyDebug", "onUnbind"); 
        sendMsg("onUnbind"); 
         
        // TODO Auto-generated method stub 
        return super.onUnbind(intent); 
    } 
     
    // 发送广播信息 
    private void sendMsg(String msg){ 
        // 指定广播目标的 action (注:指定了此 action 的 receiver 会接收此广播) 
        Intent intent = new Intent("com.webabcd.service.msg"); 
        // 需要传递的参数 
        intent.putExtra("msg", msg); 
        // 发送广播 
        this.sendBroadcast(intent); 
    } 

MyBootReceiver.java 
代码 
package com.webabcd.service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 
public class MyBootReceiver extends BroadcastReceiver { 
    // 用于接收满足条件的 Broadcast(相应的 Broadcast 的注册信息详见 AndroidManifest.xml , 
当系统启动完毕后会调用这个广播接收器) 
    @Override 
    public void onReceive(Context arg0, Intent arg1) { 
        Log.d("MyDebug", "onReceive"); 
         
        // 启动服务 
        Intent service = new Intent(arg0, MyService.class); 
        arg0.startService(service); 
    } 

AndroidManifest.xml 
代码 
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.webabcd.service" android:versionCode="1" 
    android:versionName="1.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
        <activity android:name=".Main" android:label="@string/app_name"> 
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
        </activity> 
         
        <!--            如果有需要用到的 service ,则都要在这里做相应的配置 
        --> 
        <service android:name=".MyService"></service> 
         
        <!--            注册⼀个 BroadcastReceiver 
            其 intent-filter 为 android.intent.action.BOOT_COMPLETED(用于接收系统启动完 
毕的 Broadcast) 
        --> 
        <receiver android:name=".MyBootReceiver"> 
            <intent-filter> 
                <action android:name="android.intent.action.BOOT_COMPLETED" /> 
            </intent-filter> 
        </receiver> 
    </application> 
     
    <!--        接受系统启动完毕的 Broadcast 的权限 
    --> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    <uses-sdk android:minSdkVersion="3" /> 
</manifest>  
OK 
原创粉丝点击