GeekBand--第四周分享
来源:互联网 发布:数据多用list还是map 编辑:程序博客网 时间:2024/04/29 18:52
Service
什么是Service?
Service是一个应用组件,可以在后台执行长时间的操作,不会提供用户界面,在后台默默的服务
注意 :Service不是一个进程也不是一个线程
一共有两种方法启动服务
- startService
- bindService
startService
用于启动一个服务,不进行通信,在停止服务的时候用stopService
startService(new Intent(MainActivity.this,MusicService.class));
stopService(new Intent(MainActivity.this,MusicService.class));
注意:一定要在AndroidManifest.XML文件中注册Service
bindService
用bindService 绑定到Service,并且可以进行通信,在停止服务的时候用unbindService
bindService(new Intent(MainActivity.this, MusicService.class),mServiceConnection,BIND_AUTO_CREATE);
unbindService(mServiceConnection);
private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //这里可以拿到Service,从而可以调用拿到数据 } @Override public void onServiceDisconnected(ComponentName name) { }};
IntentService
什么是intentservice
intentservice是service的子类,用来处理异步消息。
intentservice有个onHandleIntent方法,类似于MessageQueue。用于队列处理
intentservice中的onStartCommand中注意不用做耗时操作,否则会发生未响应,如果一定需要很多操作,则创建一个线程,在线程内做操作
Service的生命周期
BroadcastReceiver
什么是BoradcastReceiver
BroadcastReceiver 用于接收广播 Intent ,广播 Intent 的发送是通过调用Context.sendBroadcast()Context.sendOrderedBroadcast() 来实现的。通常一个广播 Intent 可以被订阅了此 Intent 的多个广播接收者所接收。
通常我们用BoradcastReceiver来监控电池的电量
private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 相关处理,如收短信,监控电池的电量 }};
如果是在代码中注册的话
IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(MAIN_UPDATE_UI); registerReceiver(receiver, intentFilter);
也可以在AndroidMainfest.xml中注册
< receiver android:name = ".MyBroadcastReceiver" > < intent-filter > < action android:name = " android.appwidget.action.APPWIDGET_UPDATE" /> <action android:name="main_activity_update_ui" /> </ intent-filter > </ receiver >
Webview
什么是WebView
Webview能加载显示网页,可以把它视为一个浏览器
可以通过 webView.loadUrl("http://www.baidu.com");
来显示网页
也可以通过 webView.loadUrl("file:///android_asset/aa.html");
来调用本地的网页
注意:需要在AndroidMainfest.XMl中添加权限
<uses-permission android:name="android.permission.INTERNET" />
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.web); mWebView = (WebView) findViewById(R.id.web); mWebView.loadUrl("http://www.baidu.com"); mWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //拦截网页(重新加载网页) return super.shouldOverrideUrlLoading(view, url); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { //可以在页面开始时候进行操作 super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { //页面结束时候 super.onPageFinished(view, url); } @Override public void onLoadResource(WebView view, String url) { //加载资源 super.onLoadResource(view, url); } @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { //拦截请求 return super.shouldInterceptRequest(view, request); } });} mWebView.setWebChromeClient(new WebChromeClient(){ @Override public void onProgressChanged(WebView view, int newProgress) { // 设置进度 super.onProgressChanged(view, newProgress); } @Override public void onReceivedTitle(WebView view, String title) { //拿到网页标题 super.onReceivedTitle(view, title); } @Override public void onCloseWindow(WebView window) { super.onCloseWindow(window); } });
还可以与js交互
mWebView.getSettings().setJavaScriptEnabled(true);//打开JS
public class TestJs{ @JavascriptInterface public void showTost(String toast){ }} //JS调用原生 mWebView.addJavascriptInterface(new TestJs(),"TEST"); //原生调用JS mWebView.loadUrl("javascript:javaCallJS");
历史记录和导航
@Overridepublic void onBackPressed() { if(mWebView != null && mWebView.canGoBack()){ mWebView.goBack();//一个一个回退页面 mWebView.goForward();//前进页面 WebBackForwardList webBackForwardList = mWebView.copyBackForwardList();//得到历史列表 WebHistoryItem historyItem = webBackForwardList.getItemAtIndex(0); String historyUrl = historyItem.getUrl();//得到历史URL } super.onBackPressed();}
调试JS和Webview
mWebView.setWebContentsDebuggingEnabled(true);
然后打开浏览器输入chrome://inspect 之后就可以进行调试
注意调试要求:安卓4.4以上
还可以进行cookie的管理等,还有很多内容需要大家课下去了解
widget
什么是widget
就是桌面上的一些小部件。
widget需要在AndroidManifest中注册
<receiver android:name=".MusicWidgetProvider" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> <action android:name="main_activity_update_ui" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/music_widget_info" /> </receiver>
Widget配置文件
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/musicwidget"//widget的布局文件 android:minHeight="60dp" android:minWidth="180dp" android:previewImage="@drawable/preview" android:resizeMode="horizontal|vertical" android:widgetCategory="home_screen|keyguard" > </appwidget-provider>
主要的业务逻辑代码如下
public class TestWidget extends AppWidgetProvider {@Overridepublic void onReceive(Context context, Intent intent) { super.onReceive(context, intent); if(intent != null && TextUtils.equals(intent.getAction(),"widget_button_action")){ RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.musicwidget); remoteViews.setTextViewText(R.id.song_name, "be click"); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); ComponentName componentName = new ComponentName(context,TestWidget.class); appWidgetManager.updateAppWidget(componentName,remoteViews);//更新组件 }}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.musicwidget); Intent intent = new Intent(); intent.setClass(context,TestWidget.class); intent.setAction("widget_button_action"); PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intent,0);//未来将要执行的意图 remoteViews.setOnClickPendingIntent(R.id.music_text_view,pendingIntent); appWidgetManager.updateAppWidget(appWidgetIds,remoteViews);//更新所有id视图}}
这周的分享就到此结束啦,下周再见!
- GeekBand--第四周分享
- GeekBand第四周开发
- geekband android #5 第四周分享(Service)
- GeekBand--第一周分享
- GeekBand-第一周分享
- C++ 私有继承 【GeekBand 第四周】
- GeekBand C++第四周学习笔记
- geekband android #5 第十四周分享(设计模式)
- GeekBand笔记-《STL与泛型编程 》 第四周
- GeekBand 第十四周笔记
- geekband android #5 第一周分享(初识Android)
- Geekband004第四周笔记分享
- GeekBand--第二周分享
- GeekBand--第三周分享
- GeekBand--第五周分享
- GeekBand--第六周分享
- GeekBand--第七周分享
- GeekBand--第八周分享
- jvm笔记
- 【错误1】环境变量path的值超过1023字符,无法设置改值
- RelativeLayout 如何实现平分布局空间
- Cocos 安装和配置和初探(创建自己的Scene
- 压力测试 硬件测试 IPTraf 命令行网络实时监控
- GeekBand--第四周分享
- wordpress搬家插件cnblogs2wp,实测好用
- 如何由方法论设计敏捷实践, 改变团队成员既有的思维, 行为模式?
- acl权限和设置方法
- 用树莓派 + Python + OpenCV 实现家庭监控和移动目标探测(下)
- 在ROS中传递图像消息(一)
- 【HDU5651 BestCoder Round 77 (div1) A】【简单组合数】xiaoxin juju needs help 字符串位置重组构成回文串个数
- linux下chkconfig使用
- Cocos精灵