美文网首页
Android 四大组件之一Service简单的用法以及Broa

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

作者: Raybon_lee | 来源:发表于2015-09-16 17:02 被阅读2630次

    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 ,进行简单的计数,第一种是使用回调,第二种是使用通知更新

    相关文章

      网友评论

          本文标题:Android 四大组件之一Service简单的用法以及Broa

          本文链接:https://www.haomeiwen.com/subject/kbkbcttx.html