美文网首页
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