温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

android中IntentService如何使用

发布时间:2021-06-26 16:26:05 来源:亿速云 阅读:228 作者:Leah 栏目:移动开发

本篇文章为大家展示了android中IntentService如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

服务的简单说明

一、 前台服务与IntentService:

前台服务可以一直保持运行状态,而不会由于系统内存不足的原因导致被回收

service服务测试的准备代码

我们通过一个具体的案例来说明start与bind方式的service服务的生命周期的介绍。项目结果如下:

android中IntentService如何使用

一、 在MainActivity.java中做一些初始化工作,如下代码:

private final static String TAG = "MyIntentService";  private MyIntentService.MyBinder binder;   private ServiceConnection connection = new ServiceConnection() {      @Override      public void onServiceConnected(ComponentName name, IBinder service) {          binder = (MyIntentService.MyBinder) service;          binder.sayHello(name.getClassName());      }       @Override      public void onServiceDisconnected(ComponentName name) {          Log.i(TAG, "service disconnect: " + name.getClassName());      }  };   @Override  protected void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);      setContentView(R.layout.activity_main);  }

二、 创建一个简单的IntentService服务类:MyIntentService

package com.example.linux.intentservicetest;   import android.app.IntentService;  import android.content.Intent;  import android.os.Binder;  import android.os.IBinder;  import android.util.Log;   public class MyIntentService extends IntentService {      private final static String TAG = "MyIntentService";      private MyBinder myBinder = new MyBinder();       class MyBinder extends Binder {          public void sayHello(String name) {              Log.i(TAG, "say hello method: " + name);          }           public void sayWorld(String name) {              Log.i(TAG, "say world method: " + name);          }      }       @Override      public IBinder onBind(Intent intent) {          return myBinder;      }       public MyIntentService() {          super("MyIntentService");          Log.i(TAG, "myintent service constructor.");      }       @Override      public void onCreate() {          Log.i(TAG, "on create.");          super.onCreate();      }       @Override      protected void onHandleIntent(Intent intent) {          Log.i(TAG, "handle intent: " + intent.getStringExtra("username") + ", thread: " + Thread.currentThread());      }       @Override      public void onDestroy() {          super.onDestroy();          Log.i(TAG, "on destroy.");      }       @Override      public int onStartCommand(Intent intent, int flags, int startId) {          Log.i(TAG, "on start command.");          return super.onStartCommand(intent, flags, startId);      }       @Override      public boolean onUnbind(Intent intent) {          //默认返回false          String username = intent.getStringExtra("username");          Log.i(TAG, "on unbind: " + super.onUnbind(intent) + ", username: " + username);          return true;      }       @Override      public void onRebind(Intent intent) {          Log.i(TAG, "on rebind");          super.onRebind(intent);      }  }

三、 创建一个简单的前台服务类:FrontService

package com.example.linux.intentservicetest;   import android.app.Notification;  import android.app.PendingIntent;  import android.app.Service;  import android.content.Intent;  import android.os.IBinder;  import android.util.Log;   public class FrontService extends Service {      private final static String TAG = "MyIntentService";      public FrontService() {          Log.i(TAG, "front service constructor");      }       @Override      public IBinder onBind(Intent intent) {          return null;      }       @Override      public void onCreate() {          super.onCreate();          Notification.Builder builder = new Notification.Builder(this);          Intent intent = new Intent(this, MainActivity.class);          PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,                  PendingIntent.FLAG_CANCEL_CURRENT);           builder.setSmallIcon(R.mipmap.ic_launcher).setTicker("ticker");          builder.setWhen(System.currentTimeMillis()).setAutoCancel(true);          builder.setContentTitle("content title").setContentText("content text");          builder.setContentIntent(pendingIntent);           Notification notify = builder.getNotification();           notify.defaults = Notification.DEFAULT_ALL;          startForeground(10, notify);      }  }

四、 在AndroidManifest.xml中注册服务与活动

<activity android:name=".MainActivity">      <intent-filter>          <action android:name="android.intent.action.MAIN" />          <category android:name="android.intent.category.LAUNCHER" />      </intent-filter>  </activity>   <service      android:name=".MyIntentService"     android:exported="false">  </service>  <service      android:name=".FrontService"     android:enabled="true"     android:exported="true">  </service>

Intent服务的使用

一、 在MainActivity中创建方法,启动停止服务:

// 开启服务  public void startService(View view) {      Intent intent = new Intent();      intent.putExtra("username", "linux");      intent.setClass(MainActivity.this, MyIntentService.class);      startService(intent);  }   // 停止服务  public void stopService(View view) {      Intent intent = new Intent();      intent.setClass(MainActivity.this, MyIntentService.class);      stopService(intent);  }

二、 在MainActivity中创建方法,绑定解绑服务:

// 绑定服务  public void bindService(View view) {      Intent intent = new Intent();      intent.setClass(MainActivity.this, MyIntentService.class);      intent.putExtra("username", "linux");      boolean isBind = bindService(intent, connection, Context.BIND_AUTO_CREATE);      Log.i(TAG, "bind service: " + isBind);  }   // 解绑服务  public void unbindService(View view) {      Intent intent = new Intent();      intent.setClass(MainActivity.this, MyIntentService.class);      unbindService(connection);  }

三、 运行结果

点击start:

03-25 08:01:53.460 8389-8389/? I/MyIntentService: myintent service constructor.  03-25 08:01:53.460 8389-8389/? I/MyIntentService: on create.  03-25 08:01:53.475 8389-8389/? I/MyIntentService: on start command.  03-25 08:01:53.477 8389-8727/? I/MyIntentService: handle intent: linux, thread: Thread[IntentService[MyIntentService],5,main]  03-25 08:01:53.478 8389-8389/? I/MyIntentService: on destroy.


点击stop:无输出
点击bind:

03-25 08:02:25.421 8389-8389/? I/MyIntentService: bind service: true 03-25 08:02:25.422 8389-8389/? I/MyIntentService: myintent service constructor.  03-25 08:02:25.422 8389-8389/? I/MyIntentService: on create.  03-25 08:02:25.432 8389-8389/? I/MyIntentService: say hello method: com.example.linux.intentservicetest.MyIntentService

点击unbind:

03-25 08:02:28.486 8389-8389/? I/MyIntentService: on unbind: false, username: linux  03-25 08:02:28.490 8389-8389/? I/MyIntentService: on destroy.

前台服务的使用

一、 在MainActivity中创建方法,启动前台服务:

// 前台服务的使用  public void frontService(View view) {      Intent intent = new Intent();      intent.setClass(MainActivity.this, FrontService.class);      startService(intent);  }

二、 运行结果: 在手机的通知栏中

android中IntentService如何使用

IntentService的原理分析

一、 intentService是继承Service的抽象方法

public abstract class IntentService extends Service

二、 intentService包含的一些字段引用如下

private volatile Looper mServiceLooper;  private volatile ServiceHandler mServiceHandler;  private String mName;  private boolean mRedelivery;   private final class ServiceHandler extends Handler {      public ServiceHandler(Looper looper) {          super(looper);      }       @Override      public void handleMessage(Message msg) {          onHandleIntent((Intent)msg.obj);          stopSelf(msg.arg1);      }  }

二、 和service一样在启动的时候,首先是执行构造方法,接着是onCreate方法,然后是onStartCommand方法,在onStartCommand中执行了onStart方法(执行流程在android基础---->service的生命周期讲过):

onCreate方法,开启了一个线程,并且得到Looper与初始化了一个Handler

@Override  public void onCreate() {      // TODO: It would be nice to have an option to hold a partial wakelock      // during processing, and to have a static startService(Context, Intent)      // method that would launch the service & hand off a wakelock.       super.onCreate();      HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");      thread.start();       mServiceLooper = thread.getLooper();      mServiceHandler = new ServiceHandler(mServiceLooper);  }

onStart方法,用上述的Handler发送信息

@Override  public void onStart(Intent intent, int startId) {      Message msg = mServiceHandler.obtainMessage();      msg.arg1 = startId;      msg.obj = intent;      mServiceHandler.sendMessage(msg);  }

onStartCommand方法,调用onStart方法,发送信息

@Override  public int onStartCommand(Intent intent, int flags, int startId) {      onStart(intent, startId);      return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;  }


***上述的Handler得到信息,调用handleMessage方法,其中有stopSelf(msg.arg1)方法,停止了服务:

三、 这里附上service类的两个方法,源代码是android6.0的

在Service中的onStart方法已经被废弃了:

/**   * @deprecated Implement {@link #onStartCommand(Intent, int, int)} instead.  */ @Deprecated  public void onStart(Intent intent, int startId) {  }

在onStartCommand的方法中

public int onStartCommand(Intent intent, int flags, int startId) {      onStart(intent, startId);      return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY;  }

上述内容就是android中IntentService如何使用,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI