android 功能代码 后台服务通过广播更新Activity界面

无情 阅读:759 2021-04-01 10:06:23 评论:0
Android的最重要的组件式service和activity,那么在使用的过程中,我们最常遇到的问题是他们之间的通信问题。当然今天我们不研究底层的实现问题,我从上层的应用的如何使用的角度进行研究。

首先Activity调用Service

这个是比较基础的,它有两种常见的方法;

第一, 通过Intent,这个比较简单了,可以指定package name和class name的方式来调用,Intent.setClassName这个成员即可。通过putString来装载数据,startService(intent)即可例子如下:

Intent regIntent = new Intent(“com.service”);

regIntent.putExtra(“data”, "helloData");

startService(regIntent);

第二, 通过IPC,这个比较麻烦,一般用不着,这里不谈

但是,反过来,Service如何将一些状态告诉Activity呢?方法有两种

第一、 service 通过广播的形式发送broadcast,我们写一个broadcastReceiver即可,通常的情况,将broadcastReceiver写成Activity的内部类,这个onReceiver可以直接调用activity的方法来更新界面。但是内部类只能采用代码注册的方法registerReceiver(),不能再AndroidManifest.xml文件中进行静态的声明,因为内部类要依赖于外部类而存在的。如果你一定要用AndroidManifest来注册receiver,那么只能把broadcastReceiver写成单独的文件的public类。这时候,你想更新界面就比较麻烦了,你只能自己把你要更新的activity运行起来,然后再向这个activity的内部类发广播的消息来更新界面

第二、 service直接向activity发intent。在service里面进行startActivity是属于在Activity外startActivity即在task外启动activity,因此,必须在intent加入一个参数如下:Intent intentSend = new Intent(Constants.ACTION_STATUS);

intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent1.putExtra(“statues“,“end“);

context.startActivity(intent1);

但是此时会引发的一个问题是,多次startActivity会导致很多的activity实现被运行,这肯定不是我们要的,我只要一个Activity就可,此时,我们要在androidManifest里面对这个activity的launchMode设置为singleInstance

<activity android:name="com.demo.Activity"

android:label="@string/online" android:launchMode="singleInstance">

记住啦,有人设置为singleTask,也可以,但他们有一点区别。

同时记住要更新intent,这样getInstent才可以得到每次的新实例

@Override

protected void onNewIntent (Intent intent){

setIntent(intent);

}

 

废话不多说直接上源码:---Activity代码

package com.view.test; 
 
import com.view.customer.R; 
import com.view.service.UIService; 
 
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; 
 
public class TestActivity extends Activity { 
	private Button service; 
	private TextView textview; 
	// 其他控件 
	MyReceiver broadcastreciver; 
 
	@Override 
	public void onCreate(Bundle savedInstanceState) { 
		// TODO Auto-generated method stub 
		super.onCreate(savedInstanceState); 
		setContentView(R.layout.activity_test); 
		service = (Button) findViewById(R.id.service); 
		textview = (TextView) findViewById(R.id.textview); 
		service.setOnClickListener(new OnClickListener() { 
 
			@Override 
			public void onClick(View v) { 
				// TODO Auto-generated method stub 
				// 启动服务更新UI界面 
				Intent intent = new Intent(TestActivity.this, UIService.class); 
				startService(intent); 
			} 
		}); 
 
	} 
 
	@Override 
	protected void onStart() { 
		// TODO Auto-generated method stub 
		// 动态注册广播 
		broadcastreciver = new MyReceiver(); 
		IntentFilter intentfilter = new IntentFilter(); 
		intentfilter.addAction("com.view.test.TestActivity.MyReceiver"); 
		registerReceiver(broadcastreciver, intentfilter); 
		super.onStart(); 
	} 
 
	@Override 
	protected void onStop() { 
		// TODO Auto-generated method stub 
		unregisterReceiver(broadcastreciver); 
		super.onStop(); 
	} 
 
	// 编写内部广播类 
	public class MyReceiver extends BroadcastReceiver { 
 
		public MyReceiver() { 
			System.out.println("内部广播类开始实例化"); 
		} 
 
		@Override 
		public void onReceive(Context context, Intent intent) { 
			// TODO Auto-generated method stub 
			Bundle bundle = intent.getExtras(); 
			String content = bundle.getString("message"); 
			if (content.equals("0")) { 
				// 服务跟新界面成功 
				textview.setText("后台服务更新UI成功"); 
			} else { 
				// 服务跟新界面失败 
				textview.setText("后台服务更新UI失败"); 
			} 
		} 
	} 
 
}


后台服务代码:

package com.view.service; 
 
import android.app.Service; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.IBinder; 
 
public class UIService extends Service { 
 
	@Override 
	public IBinder onBind(Intent arg0) { 
		// TODO Auto-generated method stub 
		return null; 
	} 
 
	@Override 
	public void onCreate() { 
		// TODO Auto-generated method stub 
		super.onCreate(); 
	} 
 
	@Override 
	public void onDestroy() { 
		// TODO Auto-generated method stub 
		super.onDestroy(); 
	} 
 
	@Override 
	public void onStart(Intent intent, int startId) { 
		// TODO Auto-generated method stub 
		//发送广播更新UI界面 
		Intent broadcase=new Intent(); 
		broadcase.setAction("com.view.test.TestActivity.MyReceiver"); 
		Bundle bundle=new Bundle(); 
		bundle.putString("message", "0"); 
		broadcase.putExtras(bundle); 
		sendBroadcast(broadcase); 
		super.onStart(intent, startId); 
	} 
 
	@Override 
	public int onStartCommand(Intent intent, int flags, int startId) { 
		// TODO Auto-generated method stub 
		return super.onStartCommand(intent, flags, startId); 
	} 
	 
 
}


 

标签:Android
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号