又是坚苦卓绝的一周,我这种人又想放弃了,真是无语。以前看了视频还觉得挺简单,周五也作了一点点,自信满满留到周日下午完成。因而周六和朋友出去,聊了国家和民族在社会主义初级阶段的矛盾(6不6),以及自身的发展问题,有点无奈,感受本身人生选择变少了,眼界窄的可怕。。。而后周日下午开始写做业,结果各类BUG。因而又想放弃,结果老师一眼看出缺个非空判断语句,这种问题也是能搞死人的。。。下周晚上不能玩了,要看文档了html
首先继承
public class MusicService extends Serviceandroid
在ManiFest.xml中添加申明
<service android:name=".MusicService"/>app
接着在res中添加raw文件夹,用于存放音频文件(英文小写)ide
服务启动方法有二:函数
1.start启动方式
1布局
@Override public void onCreate() { super.onCreate(); mMediaPlayer = MediaPlayer.create(this,R.raw.libai); }
2测试
@Override public int onStartCommand(Intent intent, int flags, int startId) { mMediaPlayer.start(); return START_NOT_STICKY; }
3ui
@Override public void onDestroy() { mMediaPlayer.stop(); super.onDestroy(); }
大体生命周期:onCreate()->onStartCommand->onDestroy()this
2.bind方式(比做桥梁)
1.Service中新建内部类,返回MusicService给Activity中的ServiceConnection.net
public class LocalBinder extends Binder { MusicService getService(){ return MusicService.this; } }
2.暂存Binder中,Binder实现了IBinder接口,故实例化IBinder对象来绑定service
private IBinder mIBinder = new LocalBinder();
3.在Service类的默认方法中获得IBinder对象
@Nullable @Override public IBinder onBind(Intent intent) { return mIBinder; }
4.此处传入一个mServiceConnection
bindService(new Intent(MainActivity.this, MusicService.class), mServiceConnection, BIND_AUTO_CREATE);
5.写一个链接带两个方法(有点绕)
private ServiceConnection mServiceConnection = new ServiceConnection() { private MusicService mMusicService; @Override public void onServiceConnected(ComponentName name, IBinder service) { MusicService.LocalBinder localBinder= (MusicService.LocalBinder) service; mMusicService = localBinder.getService(); } @Override public void onServiceDisconnected(ComponentName name) { } };
6.最后unbindService
unbindService(mServiceConnection);
一、四大组件之一:广播(通知消息)接收器 –要想到在Manifest中注册
二、系统使用了不少广播:通知时间改变(闹钟才会响)、电池电量变低、拍摄了照片、改变了语言
三、没有用户界面。
四、只负责向全部在Manifest里的注册者发送广播,须要这个广播的人去接收它。
BroadcastReceiver的两种注册方式:
1.静态注册
<receiver android:name=".TestBroadcastReceiver"> <intent-filter> <action android:name="com.example.test.broadcast"/> </intent-filter> </receiver>
2.动态注册,在onStart方法中注册,在onStop方法中反注册
@Override protected void onStart() { super.onStart(); /* 动态注册广播*/ //根据action里的android:name过滤广播。 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(COM_EXAMPLE_TEST_BROADCAST); registerReceiver(mTestBroadcastReceiver, intentFilter); } @Override protected void onStop() { super.onStop(); unregisterReceiver(mTestBroadcastReceiver); }
二者的区别:静态注册的广播一直有效,动态注册的广播须要反注册掉,否则注册在内存里,会不断的消耗内存,因此经常使用动态注册。
MainActivity类
@Override public void onClick(View view) { /* 发送广播 */ Intent intent = new Intent(MainActivity.this,TestBroadcastReceiver.class); //只发给action为COM_EXAMPLE_TEST_BROADCAST intent.setAction(COM_EXAMPLE_TEST_BROADCAST); intent.putExtra("toast", "this is a toast of broadcast"); sendBroadcast(intent); }
BroadcastReceiver类
public class TestBroadcastReceiver extends BroadcastReceiver { /* 接收广播、处理数据 */ @Override public void onReceive(Context context, Intent intent) { if (intent != null){ //判断字符串是否相等TextUtils.equals(). if (TextUtils.equals(intent.getAction(),MainActivity.COM_EXAMPLE_TEST_BROADCAST)){ String toastString = intent.getStringExtra("toast"); Toast.makeText(context,toastString,Toast.LENGTH_SHORT).show(); } } } }
BroadcastReceiver的生命周期:Register – SendBroadcast – onReceive – unRegister
如下内容基本摘抄自上面这个博客,由于写的很好且详细,因此推荐直接看这个,本身这里只介绍一部份内容
App Widget是应用程序窗口小部件(Widget)是微型的应用程序视图,它能够被嵌入到其它应用程序中(好比桌面)并接收周期性的更新。你能够经过一个App Widget Provider来发布一个Widget。官方文档地址:http://developer.android.com/guide/topics/appwidgets/index.html
这里涉及到两个方面的内容:AppWidgetProvider类和appwidget-provider标签;
一、appwidget-provider标签:定义桌面widget的大小,初始状态等等信息
android:minWidth : 最小宽度 android:minHeight : 最小高度 android:updatePeriodMillis : 更新widget的时间间隔(ms),"86400000"为1个小时 android:previewImage : 预览图片 android:initialLayout : 加载到桌面时对应的布局文件 android:resizeMode : widget能够被拉伸的方向。horizontal表示能够水平拉伸,vertical表示能够竖直拉伸 android:widgetCategory : widget能够被显示的位置。home_screen表示能够将widget添加到桌面,keyguard表示widget能够被添加到锁屏界面。 android:initialKeyguardLayout : 加载到锁屏界面时对应的布局文件
二、AppWidgetProvider类:
上面咱们经过appwidget-provider标签就能够获得初始化的布局,视图等,但咱们的widget要实时更新怎么办,要响应用户操做怎么办,这就须要额外的类来辅助处理了,这个类就是AppWidgetProvider。
因为AppWidgetProvider要接收到当前widget的状态(是否被添加,是否被删除等),因此要接收通知,必然是派生自BroadcastReceiver。
AppWidgetProvider中的广播处理函数以下:(根据不一样的使用状况,重写不一样的函数)
onUpdate():
在3种状况下会调用OnUpdate()。onUpdate()是在main线程中进行,所以若是处理须要花费时间多于10秒,处理应在service中完成。(第二篇会讲为何还要有service)
(1)在时间间隔到时调用,时间间隔在widget定义的android:updatePeriodMillis中设置;
(2)用户拖拽到主页,widget实例生成。不管有没有设置Configure activity,咱们在Android4.4的测试中,当用户拖拽图片至主页时,widget实例生成,会触发onUpdate(),而后再显示activity(若是有)。这点和资料说的不同,资料认为若是设置了Configure acitivity,就不会在一开始调用onUpdate(),而实验显示当实例生成(包括建立和重启时恢复),都会先调用onUpate()。在本例,因为此时在preference还没有有相关数据,建立实例时不能有效进行数据设置。
(3)机器重启,实例在主页上显示,会再次调用onUpdate()
onDeleted(Context, int[]):
当 widget 被删除时被触发。
onEnabled(Context):
当第1个 widget 的实例被建立时触发。也就是说,若是用户对同一个 widget 增长了两次(两个实例),那么onEnabled()只会在第一次增长widget时触发。
onDisabled(Context):
当最后1个 widget 的实例被删除时触发。
onReceive(Context, Intent):
在接收到广播时,调用。
网页显示器,显示网页、解析网页、加载网页。
参考:
http://blog.csdn.net/sinat_16640839/article/details/50976429
http://blog.csdn.net/harvic880925/article/details/41445407