一个Android程序有四大基本组件,但只有activity是必须有的
第一步:新建一个类继承自activity, 并且为该activity设置布局文件
public class MyNext extends Activity {
......
setContentView(R.layout.activity_next);
}
第二步,在Androidmanifest.xml清单文件中配置该activity
public class MyService extends Service {
......
}
开启服务的方式 有两种
//开启服务
startService(new Intent(MyNext.this,MyService.class));
//结束服务
stopService(new Intent(MyNext.this,MyService.class));
利用 这种方式开启服务时其生命周期为:onCreate-->onStartCommand--->onDestroy,当我多次调用startService时,如果服务已经被创建则只会调用onStartCommand方法,若未创建则去调用onCreate。。。。
12-16 11:09:38.154 21909-21909/com.example.yong.myfirstdemo I/tag﹕ 调用的方法是->>onCreate---com.example.yong.myfirstdemo.MyService
12-16 11:09:38.154 21909-21909/com.example.yong.myfirstdemo I/tag﹕ 调用的方法是->>onStartCommand---com.example.yong.myfirstdemo.MyService
12-16 11:09:40.599 21909-21909/com.example.yong.myfirstdemo I/tag﹕ 调用的方法是->>onStartCommand---com.example.yong.myfirstdemo.MyService
12-16 11:09:40.898 21909-21909/com.example.yong.myfirstdemo I/tag﹕ 调用的方法是->>onStartCommand---com.example.yong.myfirstdemo.MyService
12-16 11:09:43.090 21909-21909/com.example.yong.myfirstdemo I/tag﹕ 调用的方法是->>onyDestroy---com.example.yong.myfirstdemo.MyService
//开启服务
bindService(new Intent(MyNext.this,MyService.class), serviceConnection, BIND_AUTO_CREATE);
//关闭服务,参数与开启服务中的serviceConnection为同一个,若不相同,会出现如下错误
unbindService(serviceConnection);
当bindservice方法与unbindService方法的参数serviceConnection使用的不同时会出现如下错误,如果出现如下I错去,那就要检查一下serviceConnection是不是在unbindService时重新创建了一次:
java.lang.IllegalArgumentException: Service not registered: com.example.yong.myfirstdemo.activity.MyNext$MyServiceConn@411c3870
at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:959)
at android.app.ContextImpl.unbindService(ContextImpl.java:1574)
at android.content.ContextWrapper.unbindService(ContextWrapper.java:484)
at com.example.yong.myfirstdemo.activity.MyNext.onClick(MyNext.java:191)
at android.view.View.performClick(View.java:4222)
at android.view.View$PerformClick.run(View.java:17624)
at android.os.Handler.handleCallback(Handler.java:800)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5398)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:603)
at dalvik.system.NativeStart.main(Native Method)
用这种方式开启服务时服务的生命周期为:onCreate-->onBind-->onUnbind-->onDestroy,在服务创建后,我调用多次bindService方法,不会再去调用onCreate 和onBind方法。。在服务创建后不论是退出activity还是调用unbindService方法都会去调用onUnbind和onDestroy方法12-16 11:12:57.410 22870-22870/com.example.yong.myfirstdemo I/tag﹕ 调用的方法是->>onCreate---com.example.yong.myfirstdemo.MyService
12-16 11:12:57.411 22870-22870/com.example.yong.myfirstdemo I/tag﹕ 调用的方法是->>onBind---com.example.yong.myfirstdemo.MyService
12-16 11:13:06.918 22870-22870/com.example.yong.myfirstdemo I/tag﹕ 调用的方法是->>onUnbind---com.example.yong.myfirstdemo.MyService
12-16 11:13:06.922 22870-22870/com.example.yong.myfirstdemo I/tag﹕ 调用的方法是->>onyDestroy---com.example.yong.myfirstdemo.MyService
java.lang.IllegalArgumentException: Service not registered: com.example.yong.myfirstdemo.activity.MyNext$MyServiceConn@412019c0
at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:959)
at android.app.ContextImpl.unbindService(ContextImpl.java:1574)
at android.content.ContextWrapper.unbindService(ContextWrapper.java:484)
at com.example.yong.myfirstdemo.activity.MyNext.onClick(MyNext.java:186)
at android.view.View.performClick(View.java:4222)
at android.view.View$PerformClick.run(View.java:17624)
at android.os.Handler.handleCallback(Handler.java:800)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5398)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:603)
at dalvik.system.NativeStart.main(Native Method)
try {
unbindService(serviceConnection);
} catch (IllegalArgumentException e) {
//异常处理代码
Log.i("tag","还未绑定服务");
}
class MyBroadCastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//监听到广播时的代码
Log.i("tag", "调用的方法是->>onReceive" + "---" + getClass().getName());
}
}
IntentFilter filter = new IntentFilter("com.receiver");
MyBroadCastReceiver mBroadCastReceiver = new MyBroadCastReceiver();
//注册广播
registerReceiver(mBroadCastReceiver, filter);
//撤销广播
unregisterReceiver(mBroadCastReceiver);
//发送广播
sendBroadcast(new Intent("com.receiver"));
java.lang.IllegalArgumentException: Receiver not registered: com.example.yong.myfirstdemo.MyBroadCastReceiver@411d37f8
at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:665)
at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1462)
at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:445)
at com.example.yong.myfirstdemo.activity.MyNext.onClick(MyNext.java:202)
at android.view.View.performClick(View.java:4222)
at android.view.View$PerformClick.run(View.java:17624)
at android.os.Handler.handleCallback(Handler.java:800)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5398)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:603)
at dalvik.system.NativeStart.main(Native Method)
try {
unregisterReceiver(mBroadCastReceiver);
}catch (IllegalArgumentException e){
//广播未注册时的处理代码
}
注册广播有两种方式,各有利弊
1,在xml中注册,属于常驻型广播,广播在应用开启前注册,在应用结束后,仍旧存在,不随着activity的结束而终止
2,在代码中注册,属于非常驻型,存活周期受activity影响,方便管理
总结:
首先,哪些属于耗时操作? 网络操作,大文件的拷贝,阻塞式的请求等属于耗时操作。。
activity属于可视化的用户交互界面,在activity的UI线程中执行耗时操作,或造成卡顿现象,直接影响用户体验,可以在activity中开启线程去进行耗时操作, 用AsyncTask解决。
广播接收器的onReceive方法执行时间特别短只有不到10s,这也就意味着无法在广播接收器中进行耗时操作,而且因为onReceive方法时间太短也无法去开启子线程来进行耗时操作,所以可以在onReceive方法中开启服务,在服务中进行耗时操作。