Android 四大组件之一Service简单的用法以及Broadcast使用

Android studio 工程

第一步,创建一个工程,建立一个简单的service

1.我们工程创建完毕,接下来进入到MainActivity里面,在当前包下右键创建一个类,继承自Service,具体的操作我们截图了,看截图怎么创建,只是新手操作的,
在创建好的工程基础上进行如下操作

右键包名

我们创建一个自定义action的service

这里两种Service 为什么我们选择第一种其实这个地方我也了解的不是很深入,

  1. 第二种我们可以在AndroidMainfest.xml 指定Intent-filter里面的action name 因为系统服务很多,简单来说也就是指定一个匹配名字,知道我们当前需要用哪一个服务,是需要在使用时绑定的,使用bindService
  2. 第一种的那个我们一般是直接使用startService(intent),启动服务的,这两种具体怎么区分我也不是很清楚,待后面仔细研究一下,我的简单理解就是所管理的生命周期不一样,
自己定义使用的服务类

接下来我们看下服务类怎么写,这里还有一步,别忘了,就是在配置文件
添加,创建好之后这个要手动添加一下action,来给我们的服务起个名字

<application    android:allowBackup="true"  
  android:icon="@mipmap/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="my.teco.plee.sigalton.MsgService" 
       android:enabled="true"        
android:permission="my.teco.plee.sigalton.MsgService"> 
       <intent-filter>            <action 
android:name="my.teco.plee.sigalton.MSG_ACTION"></action>   
</intent-filter>  
  </service>
</application>

这里写代码了

public class MsgService extends Service {  
  /**   
  * 进度条的最大值   
  */    
public static final int MAX_PROGRESS_VALUE = 100;   
 /** 
    * 进度条的进度值    
 */   
 private int progress = 0;  
//下面这句话是第二种方法,用通知
  private  Intent intent = new Intent("my.teco.plee.sigalton.RECEIVER"); 
//下面这个是使用第一种方法  
 /**   
  * 更新进度的回调接口  
   */    
private  OnProgressListener onProgressListener;
    /**
     *  注册回调接口的方法,供外部调用   
  */   
 public  void  setOnProgressListener(OnProgressListener onProgressListener){   
    //获取传入的接口对象  
      this.onProgressListener = onProgressListener;  
  }   
 /**     
* 增加get() 方法,供Activity调用     
*    
 * @return 下载进度   
  */   
 public int getProgress() {     
   return progress;  
  }   
 /**    
 * 模拟下载任务,每秒钟更新一次  
   */   
 public void startDownLoad() {    
    new Thread(new Runnable() {        
    @Override     
       public void run() {      
          while (progress < MAX_PROGRESS_VALUE) {   
                 progress += 5;           
         //发送Action为my.teco.plee.sigalton.RECEIVER      
              intent.putExtra("progress",progress);     
               sendBroadcast(intent);//           
         //进度条发生变化通知方法//          
          if (onProgressListener !=null){//       
                 onProgressListener.onProgress(progress);//   
                 }         
           try {                     
                   Thread.sleep(1000);               
     } catch (InterruptedException e) {      
                  e.printStackTrace();                
    }              
  }      
      }   
     }).start();//开启  
  } 
   public MsgService() {
    }  
  @Override 
   public int onStartCommand(Intent intent, int flags, int startId) {  
      startDownLoad();   
     return super.onStartCommand(intent, flags, startId);  
  } 
   @Override  
  public IBinder onBind(Intent intent) {     
   // TODO: Return the communication channel to the service.
//如果使用第一种方法的话需要下面这样写
//   return new MsgBinder();      
//第二种方法需要写成下面
  return null;
//        throw new UnsupportedOperationException("Not yet implemented");    
} 
//返回绑定服务返回的实例
   public  class  MsgBinder extends Binder{    
    /**      
   * 获取当前Service的实例       
  * @return     
    */     
   public  MsgService getService(){       
     return MsgService.this;   
     } 
   }}

MainActivity 我们的代码,第一种方法,

public class MainActivity extends AppCompatActivity { 
   private MsgService msgService;   
   private int progress = 0; 
   private ProgressBar mProgressBar;  
   private  MsgReceiver msgReceiver;
   private  Intent mIntent;   
 @Override   
 protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState);        
setContentView(R.layout.activity_main);//        
SharePreferenceClass.getInstance().getClass();   
     //绑定Service 第一种方法  ,如果使用第二种方法注释下面这两句  
    Intent intent = new Intent("my.teco.plee.sigalton.MSG_ACTION");    
    bindService(intent,connection, Context.BIND_AUTO_CREATE);  
//第二种方法,打开下面的广播接收器
    //动态注册广播接收器       
// msgReceiver = new MsgReceiver();  
  //    IntentFilter intentFilter = new IntentFilter();    
 //   intentFilter.addAction("my.teco.plee.sigalton.RECEIVER");  
 //     registerReceiver(msgReceiver, intentFilter);    
    mProgressBar = (ProgressBar) findViewById(R.id.progessBar1);
        Button button = (Button) findViewById(R.id.button1);    
    button.setOnClickListener(new View.OnClickListener() {  
          @Override      
      public void onClick(View v) {  
//下面是第一种方法,每次我们只能使用一个
              //开始下载
        msgService.startDownLoad();       
         //监听进度
               listenProgress();   
//下面是第二种形式启动service,我们先注释掉
             //启动服务         
      // mIntent = new Intent("my.teco.plee.sigalton.MSG_ACTION"); 
            //   startService(mIntent);      
      }  
      });  
  }   
 /**   
  *  监听进度,每秒获取调用MsgService 的getPress方法来获取进度,更新UI   
  */   
 public void listenProgress() {  
      new Thread(new Runnable() {      
      @Override        
    public void run() {       
         while (progress < MsgService.MAX_PROGRESS_VALUE) {  
                  progress = msgService.getProgress();    
                mProgressBar.setProgress(progress);    
                System.out.println(progress+"我");         
           try {                      
            Thread.sleep(1000);                
    } catch (InterruptedException e) {             
           e.printStackTrace();                 
   }              
  }         
   }       
 }).start();   
 }   
//第一种方法使用下面这个
 ServiceConnection connection = new ServiceConnection() {    
    @Override       
 public void onServiceConnected(ComponentName name, IBinder 
service) {         
   //返回一个MsgService对象     
       msgService = ((MsgService.MsgBinder) service).getService();  
          //注册回调接口来接受下载进度的变化    
        //msgService 相当于Class B,Activity 相当于Class  a , 
           // setOnProgressListener相当于方法C,A调用B类的方法C,C方法的参数中有接口。         
   // 传入方法C中的接口要实现接口中的方法。 
           msgService.setOnProgressListener(new 
OnProgressListener() {        
        @Override         
       public void onProgress(int progress) {    
                mProgressBar.setProgress(progress);   
             }       
     });        
    System.out.println("我已经连接了");    
    }     
   @Override     
   public void onServiceDisconnected(ComponentName name) {     
   }    }; 
   @Override   
 protected void onDestroy() {    
    super.onDestroy();   
     //停止服务     
   unbindService(connection);   
     //注销广播      第二种在写这个,
  unregisterReceiver(msgReceiver);   
 }  
// 第二种方法使用下面的     
/**    
 * 广播接受器     
*/   
 public  class  MsgReceiver extends BroadcastReceiver{    
    @Override    
    public void onReceive(Context context, Intent intent) {   
         //拿到进度      
      int progress = intent.getIntExtra("progress",0);      
      mProgressBar.setProgress(progress);          
  System.out.println(progress + "我");     
   }   
 }}

我们贴上接口代码
public interface OnProgressListener {   
 void  onProgress(int progress);}
}

最后我们看一下工程目录结构

看图上代码结构进行配置工程

以上是使用service ,进行简单的计数,第一种是使用回调,第二种是使用通知更新

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,401评论 25 707
  • HandlerThread是一个Android 已封装好的轻量级异步类。HandlerThread本质上是一个线程...
    kjy_112233阅读 1,262评论 0 9
  • 文/我叫o泡 今天原本的出门的目的只是为了去买安东尼的新书《绿》,可是在书店里来来回回的转了好几圈找了好久也没有看...
    我叫O泡阅读 1,490评论 19 6
  • ( 一) 沧月在《乱世》中写道:所有的过程,只是一个灵魂来到这个世界上受苦,然后死去。但是,由于他的努力,他...
    闻霈阅读 264评论 0 1
  • 千年不变的黑夜深沉、压抑,像杨爵的性格、像万辰说话的语气! 黑夜是深邃的,像巫千尚的双眸、像小叶若隐若...
    庄寒阅读 354评论 2 0