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的生命周期

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视图}}

这周的分享就到此结束啦,下周再见!

0 0
原创粉丝点击