Android Service与Activity交互

来源:互联网 发布:mac上下载软件必须要 编辑:程序博客网 时间:2024/05/17 22:53

andriod程序中,service一般处于后台运行,activity则有相应的界面,能与用户交互。本例主要研究service与activity之间通信,实现机制是service发送一个广播,activity注册接收器,在接收到相应的广播后执行相应的动作。先看效果图:


首先点击按钮后service启动,service中有个线程在第五秒的时候向系统发送广播,activity获取到广播后关闭service,并将service传过来的值显示出来。通过广播信息实现service与activity的信息交互。具体代码如下,重要代码已给出注释:

MainActivity实现广播接收器,并过滤广播信息,针对service的广播作出回应,具体代码:

package com.example.servicedemo;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {private mServiceReceiver mReceiver;private TextView mTextView;private Button mButton01, mButton02;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mTextView = (TextView) findViewById(R.id.txt);mButton01 = (Button) findViewById(R.id.btn01);mButton02 = (Button) findViewById(R.id.btn02);//启动service服务mButton01.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent i = new Intent(MainActivity.this,mService1.class);i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startService(i);Toast.makeText(MainActivity.this, "服务启动", Toast.LENGTH_SHORT).show();mTextView.setText("服务启动");}});//终止服务mButton02.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent i = new Intent(MainActivity.this,mService1.class);if(stopService(i) == true){mTextView.setText("服务关闭");Toast.makeText(MainActivity.this, "服务已经关闭", Toast.LENGTH_SHORT).show();}else{mTextView.setText("服务关闭出错");}}});}@Overrideprotected void onResume(){try{//前端程序生命周期开始IntentFilter mFilter;//自定义要过滤的广播信息mFilter = new IntentFilter(mService1.HIPPO_SERVICE_IDENTIFIER);mReceiver = new mServiceReceiver();registerReceiver(mReceiver,mFilter);}catch(Exception e){mTextView.setText(e.toString());e.printStackTrace();}super.onResume();}@Overrideprotected void onPause(){//前端程序生命周期结束,解除向系统注册的receiverunregisterReceiver(mReceiver);super.onPause();}public class mServiceReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubtry{//获取来自后台服务Broadcast的参数Bundle bundle = intent.getExtras();String strParaml = bundle.getString("STR_PARAM1");//将从service里传来的广播信息显示在textview上mTextView.setText(strParaml);Intent i = new Intent(MainActivity.this,mService1.class);//若关闭service则弹出框提示用户if(stopService(i) == true){Toast.makeText(MainActivity.this, "服务已经关闭", Toast.LENGTH_SHORT).show();}}catch(Exception e){mTextView.setText(e.toString());e.printStackTrace();}}}}

mService1继承Service,并实现广播发送代码:

package com.example.servicedemo;import android.app.Service;import android.content.Intent;import android.os.Handler;import android.os.IBinder;public class mService1 extends Service{//创建handler对象private Handler objHandler = new Handler();//服务里面的递增整数counterprivate int intCounter = 0;//自定义要过滤的广播信息public static final String HIPPO_SERVICE_IDENTIFIER = "DavidLanz";//进程每秒运行一次private Runnable mTasks = new Runnable(){public void run(){intCounter ++;//当后台service运行5秒之后,送出自定义的广播信息if(intCounter == 5){//DavidLanzIntent i = new Intent(HIPPO_SERVICE_IDENTIFIER);//通过putExtra方法封装参数返回Activityi.putExtra("STR_PARAM1", "信息来自service,将为您关闭service");sendBroadcast(i);}objHandler.postDelayed(mTasks, 1000);}};@SuppressWarnings("deprecation")@Overridepublic void onStart(Intent intent,int startId){super.onStart(intent, startId);}@Overridepublic void onCreate(){//服务开启,启用进程objHandler.postDelayed(mTasks, 1000);super.onCreate();}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onDestroy(){// 关闭服务关闭进程 objHandler.removeCallbacks(mTasks);super.onDestroy();}}
AndroidManifest.xml配置:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.servicedemo"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="21" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name=".MainActivity"            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 = ".mService1"            android:exported = "true"            android:process = ":remote"/>    </application></manifest>


demo下载



0 0