zoukankan      html  css  js  c++  java
  • 系出名门Android(4) 活动(Activity), 服务(Service), 广播(Broadcast), 广播接收 器(BroadcastReceiver)

    介绍 
    在 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 

  • 相关阅读:
    POJ 3436 ACM Computer Factory (网络流,最大流)
    POJ 1847 Tram (最短路径)
    POJ 1062 昂贵的聘礼(图论,最短路径)
    POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离)
    POJ 3159 Candies (图论,差分约束系统,最短路)
    POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)
    POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环)
    POJ 3660 Cow Contest / HUST 1037 Cow Contest / HRBUST 1018 Cow Contest(图论,传递闭包)
    POJ 1502 MPI Maelstrom / UVA 432 MPI Maelstrom / SCU 1068 MPI Maelstrom / UVALive 5398 MPI Maelstrom /ZOJ 1291 MPI Maelstrom (最短路径)
    POJ 1860 Currency Exchange / ZOJ 1544 Currency Exchange (最短路径相关,spfa求环)
  • 原文地址:https://www.cnblogs.com/ggzjj/p/2857292.html
Copyright © 2011-2022 走看看