android service 广播 更新 activity

简介: 引用:http://android.tgbus.com/Android/tutorial/201106/356126.shtml 在用Service下载文件时,一个问题就是Service没有界面,如何通知用户当前下载的进度,Service直接向Activity传数据有点麻烦,于是eoe想到了用Broadcast,Service广播,Activity负责接收,再对接收到的数据进行处理,就达到了我们的目的。

引用:http://android.tgbus.com/Android/tutorial/201106/356126.shtml

在用Service下载文件时,一个问题就是Service没有界面,如何通知用户当前下载的进度,Service直接向Activity传数据有点麻烦,于是eoe想到了用Broadcast,Service广播,Activity负责接收,再对接收到的数据进行处理,就达到了我们的目的。
  先注册Receiver,然后开始Service,上面的TextView和ProgressBar就会随着Service传过来的值变,解除注册Receiver或者结束Service后不会再变。
  
  Service代码:

package com.services;



import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.util.Log;



public class TestService extends Service {

        boolean isStop=false;

        @Override

        public IBinder onBind(Intent intent) {

                // TODO Auto-generated method stub

                Log.i("TAG","绑定");

                return null;

        }

        public void onCreate(){

                Log.i("TAG","Services onCreate");

                super.onCreate();

        }

        public void onStart(Intent intent,int startId){

                Log.i("TAG","Services onStart");

                super.onStart(intent, startId);

                new Thread(){//新建线程,每隔1秒发送一次广播,同时把i放进intent传出

                        public void run(){

                                int i=0;

                                while(!isStop){

                                        Intent intent=new Intent();

                                        intent.putExtra("i", i);

                                        i++;

                                        intent.setAction("android.intent.action.test");//action与接收器相同

                                        sendBroadcast(intent);

                                        Log.i("TAG",String.valueOf(i));

                                        try {

                                                sleep(1000);

                                        } catch (InterruptedException e) {

                                                // TODO Auto-generated catch block

                                                e.printStackTrace();

                                        }

                                }

                        }

                }.start();



        }

        @Override

        public void onDestroy() {

                Log.i("TAG","Services onDestory");

                isStop=true;//即使service销毁线程也不会停止,所以这里通过设置isStop来停止线程

                super.onDestroy();

        }



}


Activity代码:

package com.services;





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.ProgressBar;

import android.widget.TextView;



public class main extends Activity {

        /** Called when the activity is first created. */

        Button b1,b2,b3,b4;

        TestService mService;

        ProgressBar pb;

        MyReceiver receiver;

        TextView tv;

        @Override

        public void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

                setContentView(R.layout.main);

                b1=(Button)findViewById(R.id.b1);

                b2=(Button)findViewById(R.id.b2);

                b3=(Button)findViewById(R.id.b3);

                b4=(Button)findViewById(R.id.b4);

                b1.setOnClickListener(l1);

                b2.setOnClickListener(l2);

                b3.setOnClickListener(l3);

                b4.setOnClickListener(l4);

                pb=(ProgressBar)findViewById(R.id.pb);

                tv=(TextView)findViewById(R.id.tv);

        }







        public class MyReceiver extends BroadcastReceiver {

                //自定义一个广播接收器

                @Override

                public void onReceive(Context context, Intent intent) {

                        // TODO Auto-generated method stub

                        System.out.println("OnReceiver");

                        Bundle bundle=intent.getExtras();

                        int a=bundle.getInt("i");

                        pb.setProgress(a);

                        tv.setText(String.valueOf(a));

                        //处理接收到的内容



                }

                public MyReceiver(){

                        System.out.println("MyReceiver");

                        //构造函数,做一些初始化工作,本例中无任何作用

                }



        }





        OnClickListener l1=new OnClickListener(){



                @Override

                public void onClick(View v) {

                        // TODO Auto-generated method stub

                        startService(new Intent(main.this, TestService.class));

                        //开始服务

                }



        };

        OnClickListener l2=new OnClickListener(){



                @Override

                public void onClick(View v) {

                        // TODO Auto-generated method stub

                        stopService(new Intent(main.this, TestService.class));

                        //结束服务

                }



        };

        OnClickListener l3=new OnClickListener(){



                @Override

                public void onClick(View v) {

                        // TODO Auto-generated method stub

                        //注册接收器

                        receiver=new MyReceiver();

                        IntentFilter filter=new IntentFilter();

                        filter.addAction("android.intent.action.test");

                        main.this.registerReceiver(receiver,filter);

                }



        };

        OnClickListener l4=new OnClickListener(){



                @Override

                public void onClick(View v) {

                        // TODO Auto-generated method stub                        

                        main.this.unregisterReceiver(receiver);

                        //解除注册接收器

                }



        };

}

相关文章
|
1月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
77 6
|
1月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
27 3
|
1月前
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
19 3
|
4月前
|
Android开发
Android面试题之Activity的启动模式和flag
Android Activity的四种启动模式:standard(默认,每次启动创建新实例),singleTop(栈顶复用,不走onCreate,调用onNewIntent),singleTask(栈内唯一,清除上方Activity)和singleInstance(单独栈内唯一)。启动模式在AndroidManifest.xml中配置,Intent Flags如FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP可实现类似功能。了解这些对于处理Activity栈管理至关重要。
52 0
|
1月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
18 0
|
2月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
讲解Activity的启动流程了,Activity的启动流程相对复杂一下,涉及到了Activity中的生命周期方法,涉及到了Android体系的CS模式,涉及到了Android中进程通讯Binder机制等等, 首先介绍一下Activity,这里引用一下Android guide中对Activity的介绍:
50 4
|
3月前
|
XML Android开发 数据格式
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
本文通过案例分析了在Android中当两个Activity都设置了`android.intent.category.LAUNCHER`类别时,会导致它们同时在应用启动器的"所有应用"页面显示为不同的启动入口。
84 2
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
|
2月前
|
Android开发 开发者
Android面试之Activity启动流程简述
每个Android开发者都熟悉的Activity,但你是否了解它的启动流程呢?本文将带你深入了解。启动流程涉及四个关键角色:Launcher进程、SystemServer的AMS、应用程序的ActivityThread及Zygote进程。核心在于AMS与ActivityThread间的通信。文章详细解析了从Launcher启动Activity的过程,包括通过AIDL获取AMS、Zygote进程启动以及ActivityThread与AMS的通信机制。接着介绍了如何创建Application及Activity的具体步骤。整体流程清晰明了,帮助你更深入理解Activity的工作原理。
53 0
|
3月前
|
编解码 网络协议 Android开发
Android平台GB28181设备接入模块实现后台service按需回传摄像头数据到国标平台侧
我们在做Android平台GB28181设备对接模块的时候,遇到这样的技术需求,开发者希望能以后台服务的形式运行程序,国标平台侧没有视频回传请求的时候,仅保持信令链接,有发起视频回传请求或语音广播时,打开摄像头,并实时回传音视频数据或接收处理国标平台侧发过来的语音广播数据。
|
3月前
|
开发工具 Android开发
解决Manifest merger failed : android:exported needs to be explicitly specified for <activity>
解决Manifest merger failed : android:exported needs to be explicitly specified for <activity>
85 1