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閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,682評論 25 708
  • HandlerThread是一個Android 已封裝好的輕量級異步類。HandlerThread本質上是一個線程...
    kjy_112233閱讀 1,314評論 0 9
  • 文/我叫o泡 今天原本的出門的目的只是為了去買安東尼的新書《綠》,可是在書店里來來回回的轉了好幾圈找了好久也沒有看...
    我叫O泡閱讀 1,520評論 19 6
  • ( 一) 滄月在《亂世》中寫道:所有的過程,只是一個靈魂來到這個世界上受苦,然后死去。但是,由于他的努力,他...
    聞霈閱讀 294評論 0 1
  • 千年不變的黑夜深沉、壓抑,像楊爵的性格、像萬辰說話的語氣! 黑夜是深邃的,像巫千尚的雙眸、像小葉若隱若...
    莊寒閱讀 383評論 2 0