android 功能代码 后台服务通过广播更新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);
}
}
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。