[索引页]
[×××]


系出名门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 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 android:name =".MyService" > service >
                
                
                 < receiver android:name =".MyBootReceiver" >
                         < intent-filter >
                                 < action android:name ="android.intent.action.BOOT_COMPLETED" />
                         intent-filter >
                 receiver >
         application >
        
        
         < uses-permission android:name ="android.permission.RECEIVE_BOOT_COMPLETED" />
         < uses-sdk android:minSdkVersion ="3" />
manifest >
    OK
[×××]

更多相关文章

  1. Android sdk tool android 命令参数
  2. Android shape 参数
  3. Android根据上下文对象Context找到对应的Activity
  4. 配置android的命令行参数
  5. Android解析json数组对象
  6. UI布局参数(持续更新)
  7. android UI 配置参数
  8. Android中的Parcel机制 实现Bundle传递对象
  9. Android 4.0 x86安装教程 附带联网参数详细设置

随机推荐

  1. React Native之如何在Android上添加阴影
  2. 十分钟让你了解Android触摸事件原理(Input
  3. app在android studio的构建过程
  4. Android是否可以实现静默安装模式
  5. android插件开发机制研究
  6. Android(安卓)React Native使用原生模块
  7. Android中广播的使用
  8. 关于Android高德地图4.12无法显示地图只
  9. android关于第3方包的问题
  10. Android高仿QQ下拉刷新