Android Activity通过Service更新时间

Android中Service功能强大,使用它来更新时间简直是大材小用,然而作为我们学习练习,这样使用也是情有可原的,通过这样简单的使用,来熟悉Service的基本用法,通俗易懂,还是比较容易理解的

启动Service有两种方式,分别是调用startService()和bindService()来启动,我们就分别使用这两种方式来更新界面时间

基本知识:
一、startService()和bindService()启动Service的区别,从Service启动的生命周期来看,区别还是比较大的
这里写图片描述

二、Service与Activity的通信方式,在这里我们使用接口和广播,实现如下:

接口:

public interface InTimeListener {
    public void callBackFun(Bundle bundle);
}

TimeService:


public class TimeService extends Service {
    private boolean serviceRunning = false;
    private InTimeListener inTimerListener;


    public class TimeBinder extends Binder {
        TimeService getService() {
            return TimeService.this;
        }

    }

    public void onCreate() {
        super.onCreate();
        System.out.println("--TimeService onCreate()--");
        serviceRunning = true;
    }

    public void beginTimeListener() {
        new Thread() {
            public void run() {
                while (serviceRunning) {
                    Bundle timeBundle = getTime();

                    /** 使用广播传递信息 */
                    Intent intent = new Intent();
                    intent.setAction("com.example.administrator.javastudy.service.TimeReceiver");
                    intent.putExtras(timeBundle);
                    sendBroadcast(intent);

                    try {
                        sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

    public void startTimeListener() {
        if (inTimerListener != null) {
            new Thread() {
                public void run() {
                    while (serviceRunning) {
                        Bundle timeBundle = getTime();
                        /** 使用回调函数传递信息 */
                        inTimerListener.callBackFun(timeBundle);
                        try {
                            sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
        }
    }


    public Bundle getTime() {
        Calendar calendar = Calendar.getInstance();
        Bundle timeBundle = new Bundle();
        timeBundle.putString("year", String.valueOf(calendar.get(Calendar.YEAR)));
        timeBundle.putString("month", String.valueOf(calendar.get(Calendar.MONTH) + 1));
        timeBundle.putString("day", String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)));
        timeBundle.putString("hour", String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)));
        timeBundle.putString("minute", String.valueOf(calendar.get(Calendar.MINUTE)));
        timeBundle.putString("second", String.valueOf(calendar.get(Calendar.SECOND)));

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strFormattTme = format.format(new Date(System.currentTimeMillis()));

        timeBundle.putString("formatTime", strFormattTme);

        return timeBundle;
    }

    /** 设置回调接口 **/
    public void setTimerLintener(InTimeListener inTimerListener) {
        this.inTimerListener = inTimerListener;
    }

    public IBinder onBind(Intent intent) {
        // bindService()方式启动时调用
        System.out.println("--TimeService onBind()--");
        return new TimeBinder();
    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        // 使用startService()方式启动时调用
        beginTimeListener();
        System.out.println("--TimeService onStartCommand()--");
        return super.onStartCommand(intent, flags, startId);
    }

    public boolean onUnbind(Intent intent) {
        System.out.println("--TimeService onUnbind()--");
        return super.onUnbind(intent);
    }

    public void onDestroy() {
        serviceRunning = false;
        System.out.println("--TimeService onDestroy()--");
        super.onDestroy();
    }
}

广播接收者:

public class TimeReceiver extends BroadcastReceiver {

    private InTimeListener inTimeListener;

    public void onReceive(Context context, Intent intent) {
        if(inTimeListener!= null){
            Bundle dataBundle = intent.getExtras();
            inTimeListener.callBackFun(dataBundle);
        }
    }

    public void setmTimeListener(InTimeListener inTimeListener){
        this.inTimeListener = inTimeListener;
    }

}

TimeActivity:

public class TimeActivity extends AppCompatActivity {


    private TextView mTxtTime;

    private Intent mIntent;
    private TimeService mTimeService;
    private TimeServiceConn mTimeServiceConn;
    private TimeService.TimeBinder mTimeBinder = null;

    private TimeReceiver mTimeReceiver;

    /**
     * Handler处理信息
     */
    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            //在handler中更新UI
            Bundle timeBundle = msg.getData();
            String strYear = timeBundle.getString("year") +
                    "年 " + timeBundle.getString("month") +
                    "月 " + timeBundle.getString("day") +
                    "日 " + timeBundle.getString("hour") +
                    "时 " + timeBundle.getString("minute") +
                    "分 " + timeBundle.getString("second") +
                    "秒";

            mTxtTime.setText(strYear);
        }
    };

    /**
     * 广播接收器接收信息(静态注册方式)
     * TimeActivity$TimeReceiver; no empty constructor
     * http://blog.csdn.net/xzongyuan/article/details/39991509
     */
//    public class TimeReceiver extends BroadcastReceiver {
//        public void onReceive(Context context, Intent intent) {
//            Bundle timeBundle = intent.getExtras();
//            String strYear = timeBundle.getString("year") +
//                    "年 " + timeBundle.getString("month") +
//                    "月 " + timeBundle.getString("day") +
//                    "日 " + timeBundle.getString("hour") +
//                    "时 " + timeBundle.getString("minute") +
//                    "分 " + timeBundle.getString("second") +
//                    "秒";
//            mTxtTime.setText(strYear);
//        }
//    }

    class TimeServiceConn implements ServiceConnection {
        public void onServiceConnected(ComponentName name, IBinder service) {
            System.out.println("---ServiceConnection onServiceConnected()---");
            mTimeBinder = (TimeService.TimeBinder) service;
            mTimeService = mTimeBinder.getService();
            mTimeBinder.getService().setTimerLintener(
                    new InTimeListener() {
                        @Override
                        public void callBackFun(Bundle bundle) {
                            Message msg = new Message();
                            msg.setData(bundle);
                            mHandler.sendMessage(msg);
                        }
                    });
        }

        public void onServiceDisconnected(ComponentName name) {
            System.out.println("---ServiceConnection onServiceDisconnected()---");
            mTimeBinder = null;
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        System.out.println("---MainActivity onCreate()---");
        setContentView(R.layout.activity_time);

        onInit();
    }

    public void onInit() {

        mTxtTime = (TextView) findViewById(R.id.txt_time);

        mIntent = new Intent(this, TimeService.class);
        mTimeServiceConn = new TimeServiceConn();

        /**
         * 启动Service方式一:startService
         * */
        startService(mIntent);

        /**
         * 启动Service方式二:bindService
         * */
//        bindService(mIntent, mTimeServiceConn, Context.BIND_AUTO_CREATE);

        /**
         * 动态广播注册
         * */
        mTimeReceiver = new TimeReceiver();
        mTimeReceiver.setmTimeListener(new InTimeListener() {
            // 回调函数
            public void callBackFun(Bundle timeBundle) {
                if (timeBundle != null) {
                    String strYear = timeBundle.getString("year") +
                            "年 " + timeBundle.getString("month") +
                            "月 " + timeBundle.getString("day") +
                            "日 " + timeBundle.getString("hour") +
                            "时 " + timeBundle.getString("minute") +
                            "分 " + timeBundle.getString("second") +
                            "秒";

                    String strFormatTime = timeBundle.getString("formatTime");

                    mTxtTime.setText(strFormatTime);
                }
            }
        });

        IntentFilter filter = new IntentFilter();
        filter.addAction("com.example.administrator.javastudy.service.TimeReceiver");
        registerReceiver(mTimeReceiver,filter);
    }


    public void onStart() {
        super.onStart();
        System.out.println("---MainActivity onStart()---");
    }

    public void onResume() {
        super.onResume();
        System.out.println("---MainActivity onResume()---");

        if (mTimeService != null) {
            mTimeService.startTimeListener();
        }
    }

    public void onPause() {
        super.onPause();

        System.out.println("---MainActivity onPause()---");
    }

    public void onStop() {
        super.onStop();
        System.out.println("---MainActivity onStop()---");
    }

    public void onDestroy() {
        /**
         * 停止service方式一:stopService
         * */
        stopService(mIntent);

        /**
         * 停止service方式二:unbindService
         * */
//        if (mTimeBinder != null) {
//            unbindService(mTimeServiceConn);
//        }

        unregisterReceiver(mTimeReceiver);

        System.out.println("---MainActivity onDestroy()---");
        super.onDestroy();
    }

Service注册:

  <!-- 注册service -->
        <service android:name="com.example.administrator.javastudy.service.TimeService" />
 </application>

结果截图:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/m0_37120609/article/details/71097975
今日推荐