本文将分享android–登录网站的详细内容,并且还将对登录网站还是登陆网站的区别进行详尽解释,此外,我们还将为大家带来关于2年推广迈入新阶段,苹果iOS18将自动升级Passkey登录网站/App、
本文将分享android – 登录网站的详细内容,并且还将对登录网站还是登陆网站的区别进行详尽解释,此外,我们还将为大家带来关于2 年推广迈入新阶段,苹果 iOS 18 将自动升级 Passkey 登录网站 / App、Android - Android 面试题集 -- Android 部分答案、Android SDK Android NDK Android Studio 官方下载地址、Android Studio软件技术基础 —Android项目描述---1-类的概念-android studio 组件属性-+标志-Android Studio 连接真机不识别其他途径的相关知识,希望对你有所帮助。
本文目录一览:- android – 登录网站(登录网站还是登陆网站的区别)
- 2 年推广迈入新阶段,苹果 iOS 18 将自动升级 Passkey 登录网站 / App
- Android - Android 面试题集 -- Android 部分答案
- Android SDK Android NDK Android Studio 官方下载地址
- Android Studio软件技术基础 —Android项目描述---1-类的概念-android studio 组件属性-+标志-Android Studio 连接真机不识别其他途径
android – 登录网站(登录网站还是登陆网站的区别)
HttpClient client = new DefaultHttpClient(); HttpGet initiate = new HttpGet(url); HttpPost post = new HttpPost(url); HttpGet page = new HttpGet(restrictedurl); HttpContext localContext = new BasicHttpContext(); CookieStore cookieStore = new BasicCookieStore(); localContext.setAttribute(ClientContext.COOKIE_STORE,cookieStore); try { List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("username",username)); params.add(new BasicNameValuePair("password",password)); post.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8)); HttpResponse response = client.execute(initiate,localContext); Log.i(Tag," " + response.getStatusLine().getStatusCode()); response.getEntity().consumeContent(); response = client.execute(post," " + response.getStatusLine().getStatusCode()); response.getEntity().consumeContent(); ResponseHandler<String> handler = new BasicResponseHandler(); String htmlpage = client.execute(page,handler," " + response.getStatusLine().getStatusCode()); Log.i(Tag,htmlpage); response.getEntity().consumeContent(); } catch (UnsupportedEncodingException e) { // Todo Auto-generated catch block e.printstacktrace(); } catch (ClientProtocolException e) { // Todo Auto-generated catch block e.printstacktrace(); } catch (IOException e) { // Todo Auto-generated catch block e.printstacktrace();
这是我的LogCat:
06-06 13:38:47.033: I/LogTag (27839): StatusCode HttpGet: 200 06-06 13:38:47.197: I/LogTag (27839): StatusCode HttpPost: 200 06-06 13:38:47.361: W/System.err(27839): org.apache.http.client.HttpResponseException: Forbidden 06-06 13:38:47.377: W/System.err(27839): at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:71) 06-06 13:38:47.384: W/System.err(27839): at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:59) 06-06 13:38:47.384: W/System.err(27839): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:657) 06-06 13:38:47.384: W/System.err(27839): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:627) 06-06 13:38:47.384: W/System.err(27839): at com.dakro.wiebetaaltwat.MainActivity$AsyncPost.doInBackground(MainActivity.java:136) 06-06 13:38:47.384: W/System.err(27839): at com.dakro.wiebetaaltwat.MainActivity$AsyncPost.doInBackground(MainActivity.java:1) 06-06 13:38:47.392: W/System.err(27839): at android.os.AsyncTask$2.call(AsyncTask.java:264) 06-06 13:38:47.392: W/System.err(27839): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 06-06 13:38:47.392: W/System.err(27839): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 06-06 13:38:47.392: W/System.err(27839): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 06-06 13:38:47.392: W/System.err(27839): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 06-06 13:38:47.400: W/System.err(27839): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 06-06 13:38:47.400: W/System.err(27839): at java.lang.Thread.run(Thread.java:856)
解决方法
检查所有者和组权限.还要检查文件上的写/读/执行标志.
你可以通过webbrowser直接导航到网址,看看它是否也显示禁止的消息?
2 年推广迈入新阶段,苹果 iOS 18 将自动升级 Passkey 登录网站 / App
6 月 11 日消息,苹果公司今天面向 iOS / iPadOS 18 以及 macOS Sequoia 发布了新版密码管理应用程序“Passwords”,其中一个选项可以让现有网站和应用登录方式自动升级到 Passkey。

以上就是2 年推广迈入新阶段,苹果 iOS 18 将自动升级 Passkey 登录网站 / App的详细内容,更多请关注php中文网其它相关文章!
Android - Android 面试题集 -- Android 部分答案
2.1 Activity
1.Activity 是什么?
Activity 是 Android 的四大组件之一。是用户操作的可视化界面;它为用户提供了一个完成操作指令的窗口。
当我们创建完毕 Activity 之后,需要调用 setContentView () 方法来完成界面的显示;以此来为用户提供交互的入口。
2. 典型情况下的 Activity 生命周期?
Activity 启动–>onCreate ()–>onStart ()–>onResume ()
点击 home 键回到桌面–>onPause ()–>onStop ()
再次回到原 Activity 时–>onRestart ()–>onStart ()–>onResume ()
退出当前 Activity 时–>onPause ()–>onStop ()–>onDestroy ()
3. 异常情况下的 Activity 的生命周期 & 数据如何保存和恢复?
在 onStop 之前调用 onSaveInstanceState 保存当前 Activity 状态,当 Activity 被重新创建后,系统调用
onRestoreInstanceState,并且把 Activity 销毁时 onSaveInstanceState 方法所保存的 Bundle 对象
作为参数传递给 onRestoreInstanceState 和 onCreate 方法
onRestoreInstanceState 的调用时机发生在 onStart 之后
4. 从 Activity A 跳转到 Activity B 之后,然后再点击 back 键之后,它们的生命周期调用流程是什么?
从 Activity A 跳转到 Activity B
Activity A -> onPause()
Activity B -> onCreate()
Activity B -> onStart()
Activity B -> onResume()
Activity A -> onStop()
点击 back 键
Activity B -> onPause()
Activity A -> onRestart()
Activity A -> onStart()
Activity A -> onResume()
Activity B -> onStop()
Activity B -> onDestroy()
5. 如何统计 Activity 的工作时间?
Activity 开始工作的起点是 onResume () 而工作的停止点为 onPause (),
因此当每次 Activity 调用 onResume () 的时候记录一个时间 a,每次调用 onPause () 的时候再记录一个时间 b,
那么由 b-a 可得当次 Activity 工作的时间。
6. 给我说说 Activity 的启动模式 & 使用场景。
系统默认的启动模式:standard
系统的默认模式,每次启动一个 Activity 都会重新创建一个新的实例
栈顶复用模式:singleTop
如果在任务的栈顶正好存在该 Activity 的实例,就重用该实例 (会调用实例的 onNewIntent () ),
否则就会创建新的实例并放入栈顶,即使栈中已经存在该 Activity 的实例,只要不在栈顶,都会创建新的实例。
使用场景如新闻类或者阅读类 App 的内容页面。
栈内复用模式:singleTask
如果在栈中已经有该 Activity 的实例,就重用该实例 (会调用实例的 onNewIntent () )。
重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
使用场景如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走 onNewIntent,
并且会清空主界面上面的其他页面。
单实例模式:singleInstance
在一个新栈中创建该 Activity 的实例,并让多个应用共享该栈中的该 Activity 实例。
一旦该模式的 Activity 实例已经存在于某个栈中,任何应用再激活该 Activity 时都会重用该栈中的实例
(会调用实例的 onNewIntent () )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。
使用场景如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance 不要用于中间页面,如果用于中间页面,跳转会有问题,
比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是 B。
7. 如何在任意位置关掉应用所有 Activity & 如何在任意位置关掉指定的 Activity?
封装一个类,成员变量有一个 List 集合,当 Activity 执行 onCreate () 方法时将当前的 Activity 实例加入,
遍历这个 List 且逐一调用 finish () 即可
给每个启动的 Activity 一个 tag, 根据这个 tag 和集合可达到在任意位置关闭指定 Activity 的效果。
8.Activity 的启动流程 (从源码角度解析)?
app 启动的过程有两种情况,第一种是从桌面 launcher 上点击相应的应用图标,
第二种是在 activity 中通过调用 startActivity 来启动一个新的 activity。
我们创建一个新的项目,默认的根 activity 都是 MainActivity,而所有的 activity 都是保存在堆栈中的,
我们启动一个新的 activity 就会放在上一个 activity 上面,而我们从桌面点击应用图标的时候,由于 launcher 本身也是一个应用,
当我们点击图标的时候,系统就会调用 startActivitySately (), 一般情况下,我们所启动的 activity 的相关信息都会保存在 intent 中,
比如 action,category 等等。我们在安装这个应用的时候,系统也会启动一个 PackaManagerService 的管理服务,
这个管理服务会对 AndroidManifest.xml 文件进行解析,从而得到应用程序中的相关信息,比如 service,activity,Broadcast 等等,然后获得相关组件的信息。
当我们点击应用图标的时候,就会调用 startActivitySately () 方法,而这个方法内部则是调用 startActivty (),
而 startActivity () 方法最终还是会调用 startActivityForResult () 这个方法。
因为 startActivityForResult () 方法是有返回结果的,所以系统就直接给一个 - 1,就表示不需要结果返回了。
而 startActivityForResult () 这个方法实际是通过 Instrumentation 类中的 execStartActivity () 方法来启动 activity,
Instrumentation 这个类主要作用就是监控程序和系统之间的交互。而在这个 execStartActivity () 方法中会获取 ActivityManagerService 的代理对象,
通过这个代理对象进行启动 activity。启动会就会调用一个 checkStartActivityResult () 方法,如果说没有在配置清单中配置有这个组件,就会在这个方法中抛出异常了。
当然最后是调用的是 Application.scheduleLaunchActivity () 进行启动 activity,而这个方法中通过获取得到一个 ActivityClientRecord 对象,
而这个 ActivityClientRecord 通过 handler 来进行消息的发送,系统内部会将每一个 activity 组件使用 ActivityClientRecord 对象来进行描述,
而 ActivityClientRecord 对象中保存有一个 LoaderApk 对象,通过这个对象调用 handleLaunchActivity 来启动 activity 组件,
而页面的生命周期方法也就是在这个方法中进行调用。
9. 启动一个其它应用的 Activity 的生命周期分析。
同 4
10.Activity 任务栈是什么?在项目中有用到它吗?说给我听听
-android 任务栈又称为 Task,它是一个栈结构,具有后进先出的特性,用于存放我们的 Activity 组件。
- 我们每次打开一个新的 Activity 或者退出当前 Activity 都会在一个称为任务栈的结构中添加或者减少一个 Activity 组件,因此一个任务栈包含了一个 activity 的集合,android 系统可以通过 Task 有序地管理每个 activity,并决定哪个 Activity 与用户进行交互:只有在任务栈栈顶的 activity 才可以跟用户进行交互。
- 在我们退出应用程序时,必须把所有的任务栈中所有的 activity 清除出栈时,任务栈才会被销毁。当然任务栈也可以移动到后台,并且保留了每一个 activity 的状态。可以有序的给用户列出它们的任务,同时也不会丢失 Activity 的状态信息。
- 需要注意的是,一个 App 中可能不止一个任务栈,某些特殊情况下,单独一个 Actvity 可以独享一个任务栈。还有一点就是一个 Task 中的 Actvity 可以来自不同的 App,同一个 App 的 Activity 也可能不在一个 Task 中。
11. 什么情况下 Activity 不走 onDestory?
当 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时处于 Stoped 状态。
9.0 的时候如果强行终止 activity,那么也不会执行 onDestory
12. 什么情况下 Activity 会单独执行 onPause?
同 11
13.a->b->c 界面,其中 b 是 SingleInstance 的,那么 c 界面点 back 返回 a 界面,为什么?
SingleInstance 这是一种加强的 singleTask 模式,它除了具有 singleTask 模式所有的特性外,还加强了一点,那就是具有此种模式的 Activity 只能单独位于一个任务栈中,换句话说,比如 Activity A 是 singleInstance 模式,当 A 启动后,系统会为它创建一个新的任务栈,然后 A 独自在这个新的任务栈中,由于栈内复用的特性,后续的请求均不会创建新的 Activity, 除非这个独特的任务栈被系统销毁了
14. 如果一个 Activity 弹出一个 Dialog, 那么这个 Acitvity 会回调哪些生命周期函数呢?
是否弹出 Dialog,并不影响 Activity 的生命周期,所以这时和正常启动时 Activity 的生命回调方法一致: onCreate () -> onStart () -> onResume ()。
15.Activity 之间如何通信 & Activity 和 Fragment 之间通信 & Activity 和 Service 之间通信?
1.Activity->Activity
[1]Intent/Bundle
这种方式多用于 Activity 之间传递数据
[2] 类静态变量
在 Activity 内部定义静态的变量,这种方式见于少量的数据通信,如果数据过多,还是使用第一种方式
[3] 全局变量
创建一个类,里面定义一批静态变量,Activity 之间通信都可以访问这个类里面的静态变量,这就是全局变量。
2.Activity->Service
[1] 绑定服务的方式,利用 ServiceConnection 这个接口
[2]Intent
这种方式很简单,我们在启动和停止 Service 时所调用的方法都需要传入一个 Intent 实例对象,通过这个传入的 Intent 对象,我们就可以与 Service 进行通信。
[3] CallBack + Handler, 监听服务的进程变化
3.Activity->Fragment
[1]Bundle
在创建 Fragment 实例的时候,调用方法 setArguments 将一个 Bundle 对象传递给 Fragment,然后在 Fragment 中先去判断是否和当前 Activity 绑定上了,如果绑定上了,就可以拿出这个 Bundle 中的数据
[2] 直接进行方法调用
在 Activity 里通过 Fragment 的引用,可以直接调用 Framgent 中的定义的任何方法。
16. 说说 Activity 横竖屏切换的生命周期。
onPause
onSaveInstanceState // 这里可以用来横竖屏切换的保存数据
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState// 这里可以用来横竖屏切换的恢复数据
onResume
17. 前台切换到后台,然后在回到前台时 Activity 的生命周期。
点击 home 键回到桌面–>onPause ()–>onStop ()
再次回到原 Activity 时–>onRestart ()–>onStart ()–>onResume ()
18. 下拉状态栏时 Activity 的生命周期?
首先,通知栏下拉一点点,符合一般描述中 “Activity 被部分遮挡”——onPause ()
然后,通知栏完全落下之后,“Activity 被全部遮挡”——onStop ()
19.Activity 与 Fragment 的生命周期比较?
onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume();
Fragment 变为不可见状态(锁屏、回到桌面、被 Activity 完全覆盖):onPause ()->onSaveInstanceState ()->onStop ();
Fragment 变为部分可见状态(打开 Dialog 样式的 Activity):onPause ()->onSaveInstanceState ();
Fragment 由不可见变为活动状态:onStart ()->OnResume ();
Fragment 由部分可见变为活动状态:onResume ();
退出应用:onPause ()->onStop ()->onDestroyView ()->onDestroy ()->onDetach ()
Fragment 被回收又重新创建:被回收执行 onPause ()->onSaveInstanceState ()->onStop ()->onDestroyView ()->onDestroy ()->onDetach (),重新创建执行 onAttach ()->onCreate ()->onCreateView ()->onActivityCreated ()->onStart ()->onResume ()->setUserVisibleHint ();
横竖屏切换:与 Fragment 被回收又重新创建一样。
20. 了解哪些 Activity 常用的标记位 Flags?
1.Intent.FLAG_ACTIVITY_NEW_TASK,是为 Activity 指定 “singleTask” 启动模式
2.Intent.FLAG_ACTIVITY_SINGLE_TOP,是为 Activity 指定 “singleTop” 启动模式
3.FLAG_ACTIVITY_CLEAR_TOP,如果跟 singleTask 启动模式一起出现,如果被启动的 Activity 已经存在实例,则 onNewIntent 方法会被回调,如果被启动的 Activity 采用 standard 模式启动,那么连同它跟它之上的 Activity 都要出栈,并且创建新的实例放入栈顶。
4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,新的 Activity 不会在最近启动的 Activity 的列表中保存。等同于指定属性 android:excludeFromRecents="true"
21. 谈谈隐式启动和显示启动 Activity 的方式?
显式启动:直接指定要跳转的 Activity 类名,不用过滤,效率高,适用于同一个应用中的不同 Activity 跳转
隐式启动:需要过滤,相对耗时,但可以找到所有之匹配的应用。适用于不同应用之间的 Activity 跳转。
隐式启动会找到所匹配到的应用,并提示用户选择打开方式,如果有多个组件被匹配成功,就会以对话框列表的方式让用户进行选择。
22.Activity 用 Intent 传递数据和 Bundle 传递数据的区别?为什么不用 HashMap 呢?
要把值通过 A 经过 B 传给 C
如果用 Intent 的话 A-B 先写一遍 再在 B 中都取出来 然后在把值塞到 Intent 中 再跳到 C 累吗?
如果我在 A 中用了 Bundle 的话 我把 Bundle 传给 B 在 B 中再转传到 C C 就可以直接去了
这样的话 还有一个好处 就是在 B 中 还可以给 Bundle 对象添加新的 key - value 同样可以在 C 中取出来
为什么不用 HashMap 呢?
Bundle 内部是由 ArrayMap 实现的,ArrayMap 的内部实现是两个数组,一个 int 数组是存储对象数据对应下标,一个对象数组保存 key 和 value,内部使用二分法对 key 进行排序,所以在添加、删除、查找数据的时候,都会使用二分法查找,只适合于小数据量操作,如果在数据量比较大的情况下,那么它的性能将退化。而 HashMap 内部则是数组 + 链表结构,所以在数据量较少的时候,HashMap 的 Entry Array 比 ArrayMap 占用更多的内存。因为使用 Bundle 的场景大多数为小数据量
在 Android 中如果使用 Intent 来携带数据的话,需要数据是基本类型或者是可序列化类型,HashMap 使用 Serializable 进行序列化,而 Bundle 则是使用 Parcelable 进行序列化。而在 Android 平台中,更推荐使用 Parcelable 实现序列化,虽然写法复杂,但是开销更小,所以为了更加快速的进行数据的序列化和反序列化,系统封装了 Bundle 类,方便我们进行数据的传输。
23. 在隐式启动中 Intent 可以设置多个 action, 多个 category 吗 & 顺便讲讲它们的匹配规则?
一个 Intent 对象中最多只能包括一个 Action 属性,但可以包含多个 Category 属性
24.Activity 可以设置为对话框的形式吗?
在 mainifest 中对应的 activity 上配置如下的代码,即可让 activity 以对话框的方式表现出来
< android:theme="@android:style/Theme.Dialog">
25. 如何给 Activity 设置进入和退出的动画?
一种是直接在代码中设置,这需要使用到 Activity 的 overridePendingTransition 方法;
另一种是通过自定义 Activity 的主题来实现。
26.Activity 使用 Intent 传递数据是否有限制 & 如果传递一个复杂的对象,例如一个复杂的控件对象应该怎么做?
1 传 512K 以下的数据的数据可以正常传递。
2 传 512K~1024K 的数据会出错,闪退。
3 传 1024K 以上的数据会报错:TransactionTooLargeException。
4 考虑到 Intent 还包括要启动的 Activity 等信息,实际可以传的数据略小于 512K
如果传递一个复杂的对象,例如一个复杂的控件对象应该怎么做?
1)将对象转换为 Json 字符串
2)使用 Serializable,Parcelable 序列化对象
1.Serializable 实现:
①业务 Bean 实现:Serializable 接口,写上 getter 和 setter 方法
②Intent 通过调用 putExtra (String name, Serializable value) 传入对象实例 当然对象有多个的话多个的话,我们也可以先 Bundle.putSerializable (x,x);
③新 Activity 调用 getSerializableExtra () 方法获得对象实例: eg:Product pd = (Product) getIntent ().getSerializableExtra ("Product");
④调用对象 get 方法获得相应参数
2.Parcelable 实现:
一般流程:
①业务 Bean 继承 Parcelable 接口,重写 writeToParcel 方法,将你的对象序列化为一个 Parcel 对象;
②重写 describeContents 方法,内容接口描述,默认返回 0 就可以
③实例化静态内部对象 CREATOR 实现接口 Parcelable.Creator
④同样式通过 Intent 的 putExtra () 方法传入对象实例,当然多个对象的话,我们可以先 放到 Bundle 里 Bundle.putParcelable (x,x), 再 Intent.putExtras () 即可
3. 使用数据库
2.2 BroadcastReceiver
1. 广播是什么?
它是一种广泛运用在应用程序之间传输信息的机制,Android 中我们发送广播内容是一个 Intent, 这个 Intent 中可以携带我们要发送的数据。
2. 广播的注册方式有哪些?
1 静态注册:创建一个广播接收器类,广播接收器在 AndroidManifest.xml 文件中注册
2 动态注册:新建一个类,让它继承自 BroadcastReceiver, 并重写父类的 onReceive () 方法就行了
3. 广播的分类 & 特性 & 使用场景?
3.1 无序广播
context.sendBroadcast (Intent) 方法发送的广播,不可被拦截,当然发送的数据,接收者是不能进行修改的。
3.2 有序广播
context.sendOrderBroadcast (Intent) 方法发送的广播,可被拦截,而且接收者是可以修改其中要发送的数据,修改和添加都是可以的,这就意味着优先接收者对数据修改之后,下一个接收者接受的数据是上一个接收者已经修改了的,这必须明白。
3.3 本地广播
localBroadcastManager.sendBroadcast (Intent),只在 app 内传播。
4. 说说系统广播和本地广播的原理 & 区别 & 使用场景。
4.1 系统广播的源码角度分析
a. 自定义广播接收者 BroadcastReceiver, 并且重写 onReceiver () 方法。
b. 通过 Binder 机制向 AMS (Activity Manager Service) 进行注册。
c. 广播发送者通过 Binder 机制向 AMS 发送广播。
d.AMS 查找符合条件 (IntentFilter/Permission 等) 的 BroadcastReceiver,将广播发送到相应的 BroadcastReceiver (一般情况下是 Activity) 的消息队列中。
e. 消息循环执行拿到此广播,回调 BroadcastReceiver 中的 onReceiver () 方法。
4.2 本地广播的源码角度分析
相比于系统广播而言,本地广播更加安全,更加高效,以下是本地广播的特点以及内部的实现机制:
特点:
a. 使用它发送的广播将只在自身 app 内传播,因此你不必担心泄漏隐私的数据。
b. 其他 app 无法对你的 app 发送该广播,因此你的 app 根本不可能收到非自身 app 发送的该广播,因此你不必担心有安全漏洞可以利用。
c. 比系统广播更加高效。
5. 有两个应用注册了一样的广播,一个是静态,一个是动态,连优先级也一样,那么当广播从系统发出来后,哪个应用先接收到广播?
动态注册的接收者会先执行
2.3 ContentProvider
1. 什么是内容提供者?
(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能
2. 说说如何创建自己应用的内容提供者 & 使用场景。
新建一个类去继承 ContentProvider 类的方式来创建一个自己的内容提供器。ContentProvider 类有 6 个抽象方法,我们在使用子类继承它的时候,需要将这 6 个方法全部重写。
3. 说说 ContentProvider 的原理。
一种进程间通信的方式,其实它原理核心就是 Binder。
4.ContentProvider,ContentResolver,ContentObserver 之间的关系?
ContentProvider—— 内容提供者, 在 android 中的作用是对外共享数据,也就是说你可以通过
ContentProvider 把应用中的数据共享给其他应用访问,其他应用可以通过 ContentProvider 对你应用中的数据进行添删改查。
ContentResolver—— 内容解析者, 其作用是按照一定规则访问内容提供者的数据(其实就是调用内容提供者自定义的接口来操作它的数据)。 ContentObserver—— 内容观察者,目的是观察 (捕捉) 特定 Uri 引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器 (Trigger),当 ContentObserver 所观察的 Uri 发生变化时,便会触发它
5. 说说 ContentProvider 的权限管理。
android:grantUriPermssions: 临时许可标志。
android:permission:Provider 读写权限。
android:readPermission:Provider 的读权限。
android:writePermission:Provider 的写权限。
android:enabled: 标记允许系统启动 Provider。
android:exported: 标记允许其他应用程序使用这个 Provider。
android:multiProcess: 标记允许系统启动 Provider 相同的进程中调用客户端。
2.4 Service
1. 什么是 Service?
Service (服务) 是一个一种可以在后台执行长时间运行操作而没有用户界面的组件。它运行于 UI 线程,因此不能进行耗时的操作。
2. 说说 Service 的生命周期。
bindService:onCreate()-onBind()-unBind()-onDestroy()
这种方式进行启动 service 好处是更加便利 activity 中操作 service, 通过 ServiceConnection 来获取 service 中内部类的类对象,然后通过这个类对象就可以调用类中的方法
startService:onCreate()-onStartCommon()-onDestroy()
当我们通过 startService 被调用以后,多次在调用 startService (),onCreate () 方法也只会被调用一次,而 onStartConmon () 会被多次调用
3.Service 和 Thread 的区别?
Service 的运行是在 UI 线程当中的,是绝对绝对不能进行耗时操作的,而 Thread 开启的子线程则可以进行耗时操作,但是 Thread 开启的子线程是不能直接对 UI 进行操作的,否则极有可能发生直接让程序崩掉,这就是它们的区别。
4.Android 5.0 以上的隐式启动问题及其解决方案。
1 将隐式启动转换为显式启动,兼容编译 sdk5.0 以后版本
2 直接写上包名以及标志
3 判断应用是否安装
5. 给我说说 Service 保活方案
1) onStartCommand 方法,返回 START_STICKY
2) 提升 service 优先级
在 AndroidManifest.xml 文件中对于 intent-filter 可以通过 android:priority = "1000" 这个属性设置最高优先级,1000 是最高值,如果数字越小则优先级越低,同时适用于广播。
3) 提升 service 进程优先级
Android 中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收。Android 将进程分为 6 个等级,它们按优先级顺序由高到低依次是:
复制代码
1. 前台进程 (FOREGROUND_APP)
2. 可视进程 (VISIBLE_APP)
3. 次要服务进程 (SECONDARY_SERVER)
4. 后台进程 (HIDDEN_APP)
5. 内容供应节点 (CONTENT_PROVIDER)
6. 空进程 (EMPTY_APP)
4) onDestroy 方法里重启 service
5) Application 加上 Persistent 属性
6.IntentService 是什么 & 原理 & 使用场景 & 和 Service 的区别。
IntentService 是继承处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作,启动 IntentServiced 的方式和启动传统的 Service 一样,同时,当任务执行完成后,IntentService 会自动停止,而不需要我们手动去控制或 stopSelf ()。
a. 它本质是一种特殊的 Service, 继承自 Service 并且本身就是一个抽象类。
b. 它内部是由 HandlerThread 和 Handler 实现异步操作。
7. 创建一个独立进程的 Service 应该怎样做?
创建远程服务
1) 定义 AIDL 接口
2) 新建 Remote Service
3) 在 AndroidManifest.xml 中对 Remote Service 进行配置
8.Service 和 Activity 之间如何通信?
1、Intent 传值,onStartCommand () 接收。
2、通过 onBind () 获取 Service 实例,然后再调用 Binder 中的相关方法。
3、通过回调函数达到侦听 Service 中数据变化。
9. 说说你了解的系统 Service。
https://blog.csdn.net/geyunfei_/article/details/78851024
10. 谈谈你对 ActivityManagerService 的理解。
从系统运行的角度看,AmS 可以分为 Client 端和 Service 端:Client 端运行在各个 app 进程,app 进程实现了具体的 Activity,Service 等,告诉系统我有那些 Activity,Service 等,并且调用系统接口来完成显示;Service 端运行在 SystemServer 进程,是系统级别的 ActivityManagerService 的具体实现,其响应 Client 端的系统调用请求,并且管理 Client 端各个 app 进程的生命周期。
https://www.cnblogs.com/xingchenkn/p/3637137.html
11. 在 Activtiy 中创建一个 Thread 和在一个 Service 中创建一个 Thread 的区别?
Activtiy 中的线程是前台线程,它的生命周期往往是随着 Activity 的,Activity 销毁的时候,那个线程也应该被销毁,否则就会出现内存泄漏现象。而 Service 中开启的线程,它是工作在后台的,一般来讲,后台线程的生存期是比较长的。
2.5 Handler
1. 子线程一定不能更新 UI 吗?
是否有些控件支持在子线程更新 UI 呢?比如:SurfaceViw
在 Activity 的 onResume () 生命周期函数之前是可以在子线程中更新 UI 的。
2. 给我说说 Handler 的原理
Message:消息,其中包含了消息 ID,消息处理对象以及处理的数据等,由 MessageQueue 统一列队,终由 Handler 处理。
Handler:处理者,负责 Message 的发送及处理。使用 Handler 时,需要实现 handleMessage (Message msg) 方法来对特定的 Message 进行处理,例如更新 UI 等。
MessageQueue:消息队列,用来存放 Handler 发送过来的消息,并按照 FIFO 规则执行。当然,存放 Message 并非实际意义的保存,而是将 Message 以链表的方式串联起来的,等待 Looper 的抽取。
Looper:消息泵,不断地从 MessageQueue 中抽取 Message 执行。因此,一个 MessageQueue 需要一个 Looper。
Thread:线程,负责调度整个消息循环,即消息循环的执行场所。
Handler 是可以通过发送和处理 Message 和 Runnable 对象来关联相应线程的 MessageQueue。通常我们认为它是一种异步机制。
a. 可以让对应的 Message 和 Runnable 在未来的某个时间点进行相应的处理。
b. 让自己想要的耗时操作在子线程中完成,让更新 UI 的操作在主线程中完成,而子线程与主线程之间的通信就是靠 Handler 来完成。
3.Handler 导致的内存泄露你是如何解决的?
Handler 导致内存泄漏的原因是:非静态内部类持有外部类的引用,导致外部类在没有被使用的时候,迟迟不能被回收,从而导致内存泄漏。即非静态 Handler 内部类持有外部 Activity 的引用,导致外部 Activity 退出 / 销毁的时候,它迟迟不能被回收,最终导致 Activity 的内存泄漏。 解决方法:将 Handler 类声明为静态,如果 Handler 需要访问外部类 Activity 的成员变量或者成员方法,可以用弱引用的方式解决。
4. 如何使用 Handler 让子线程和子线程通信?
在 ThreadA 中准备一个 Looper,也就是消息轮询大管家,然后准备发送消息的 Handler,准备发送消息的 Handler 很容易理解,那就是在 ThreadA 中生成一个 Handler 对象即可,
那么准备 Looper 怎么做呢?在 ThreadA 中调用 Looper.prepare (),然后再调用 Looper.loop () 即可
5. 你能给我说说 Handler 的设计原理?
6.HandlerThread 是什么 & 原理 & 使用场景?
a.HandlerThread 本质上是一个线程类,它继承了 Thread。
b.HandlerThread 有自己内部的 Looper 对象,可以进行 Looper 循环。
c. 通过获取 HandlerThread 的 Looper 对象传递给 Handler 对象,可以在 handlerMessage 方法中执行异步任务。
d. 优点是不会有堵塞,减少对性能的消耗,缺点是不能进行多任务的处理,需要等待进行处理,处理效率较低。
e. 与线程池注重并发不同,HandlerThread 是一个串行队列,HandlerThread 背后只有一个线程
7.IdleHandler 是什么?
IdleHandler 可以用来提升性能,主要用在我们希望能够在当前线程消息队列空闲时做些事情(譬如 UI 线程在显示完成后,如果线程空闲我们就可以提前准备其他内容)的情况下,不过最好不要做耗时操作。
8. 一个线程能否创建多个 Handler,Handler 和 Looper 之间的对应关系?
一个线程可以有多个 Handler,但是一个线程只能有一个 Looper,一个 MessageQueue。因此它们之间的关系是一个线程只能有一个 Looper, 一个 MessageQueue, 多个 Handler。
9. 为什么 Android 系统不建议子线程访问 UI?
UI 控件不是线程安全的,如果多线程并发访问 UI 控件可能会出现不可预期的状态
那为什么系统不对 UI 控件的访问加上锁机制呢?
加上锁机制会让 UI 访问的逻辑变得复杂;锁机制会降低 UI 访问的效率,因为锁机制会阻塞某些线程的执行;
10.Looper 死循环为什么不会导致应用卡死?
ActivityThread 的 main 方法主要就是做消息循环,一旦退出消息循环,那么你的应用也就退出了。
11. 使用 Handler 的 postDealy 后消息队列有什么变化?
https://blog.csdn.net/qingtiantianqing/article/details/72783952
12. 可以在子线程直接 new 一个 Handler 出来吗?
1(需先在该线程中手动开启 Looper(Looper.prepare ()-->Looper.loop ()),然后将其绑定到 Handler 对象上
2(通过 Looper.getMainLooper (),获得主线程的 Looper,将其绑定到此 Handler 对象上
13.Message 对象创建的方式有哪些 & 区别?
https://blog.csdn.net/dfskhgalshgkajghljgh/article/details/52672115
Android SDK Android NDK Android Studio 官方下载地址
如果下载速度很慢或者无法下载,有三种解决方法
1. 忍耐.
2. 使用 P2SP 下载工具,比如迅雷,百度云离线.
3. 你们懂得.
无法在线升级请看下边
sudo vi /etc/hosts
添加
74.125.206.93 dl-ssl.google.com
2014.7
ADT Bundle
http://dl.google.com/android/adt/adt-bundle-windows-x86-20140702.zip
http://dl.google.com/android/adt/adt-bundle-windows-x86_64-20140702.zip
http://dl.google.com/android/adt/adt-bundle-mac-x86_64-20140702.zip
http://dl.google.com/android/adt/adt-bundle-linux-x86-20140702.zip
http://dl.google.com/android/adt/adt-bundle-linux-x86_64-20140702.zip
SDK Tools Only
http://dl.google.com/android/android-sdk_r23.0.2-windows.zip
http://dl.google.com/android/installer_r23.0.2-windows.exe
http://dl.google.com/android/android-sdk_r23.0.2-macosx.zip
http://dl.google.com/android/android-sdk_r23.0.2-linux.tgz
Android Studio
http://dl.google.com/android/studio/install/0.8.6/android-studio-bundle-135.1339820-windows.exe
http://dl.google.com/android/studio/install/0.8.6/android-studio-bundle-135.1339820-mac.dmg
http://dl.google.com/android/studio/install/0.8.6/android-studio-bundle-135.1339820-linux.tgz
Android NDK
http://dl.google.com/android/ndk/android-ndk32-r10-windows-x86.zip
http://dl.google.com/android/ndk/android-ndk32-r10-windows-x86_64.zip
http://dl.google.com/android/ndk/android-ndk32-r10-darwin-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk32-r10-darwin-x86_64.tar.bz2
http://dl.google.com/android/ndk/android-ndk32-r10-linux-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk32-r10-linux-x86_64.tar.bz2
http://dl.google.com/android/ndk/android-ndk64-r10-windows-x86.zip
http://dl.google.com/android/ndk/android-ndk64-r10-windows-x86_64.zip
http://dl.google.com/android/ndk/android-ndk64-r10-darwin-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk64-r10-darwin-x86_64.tar.bz2
http://dl.google.com/android/ndk/android-ndk64-r10-linux-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk64-r10-linux-x86_64.tar.bz2
http://dl.google.com/android/ndk/android-ndk-r10-cxx-stl-libs-with-debug-info.zip
2014.6
Android Studio 0.8
http://dl.google.com/android/studio/install/0.8.0/android-studio-bundle-135.1245622-windows.exe
http://dl.google.com/android/studio/install/0.8.0/android-studio-bundle-135.1245622-mac.dmg
http://dl.google.com/android/studio/install/0.8.0/android-studio-bundle-135.1245622-linux.tgz
Android SDK only r23
http://dl.google.com/android/android-sdk_r23-windows.zip
http://dl.google.com/android/installer_r23-windows.exe
http://dl.google.com/android/android-sdk_r23-macosx.zip
http://dl.google.com/android/android-sdk_r23-linux.tgz
ADT Bundle r23
http://dl.google.com/android/adt/adt-bundle-linux-x86_64-20140624.zip
http://dl.google.com/android/adt/adt-bundle-linux-x86-20140624.zip
http://dl.google.com/android/adt/adt-bundle-windows-x86-20140624.zip
http://dl.google.com/android/adt/adt-bundle-windows-x86-20140624.zip
http://dl.google.com/android/adt/adt-bundle-mac-x86_64-20140624.zip
Android NDK r9d
http://dl.google.com/android/ndk/android-ndk-r9d-windows-x86.zip
http://dl.google.com/android/ndk/android-ndk-r9d-windows-x86_64.zip
http://dl.google.com/android/ndk/android-ndk-r9d-darwin-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk-r9d-linux-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk-r9d-linux-x86_64.tar.bz2
http://dl.google.com/android/ndk/android-ndk-r9d-cxx-stl-libs-with-debug-info.zip
Android NDK r6b
Windows
http://dl.google.com/android/ndk/android-ndk-r6b-windows.zip
Mac OS X(intel)
http://dl.google.com/android/ndk/android-ndk-r6b-darwin-x86.tar.bz2
Linux
http://dl.google.com/android/ndk/android-ndk-r6b-linux-x86.tar.bz2
Android SDK 3.2
Windows
http://dl.google.com/android/android-sdk_r12-windows.zip
http://dl.google.com/android/installer_r12-windows.exe
Mac OS X (intel)
http://dl.google.com/android/android-sdk_r12-mac_x86.zip
Linux(i386)
http://dl.google.com/android/android-sdk_r12-linux_x86.tgz
Android NDK r6
Windows
http://dl.google.com/android/ndk/android-ndk-r6-windows.zip
Mac OS X(intel)
http://dl.google.com/android/ndk/android-ndk-r6-darwin-x86.tar.bz2
Linux 32/64-bit (x86)
http://dl.google.com/android/ndk/android-ndk-r6-linux-x86.tar.bz2
Android SDK 3.1
Windows
http://dl.google.com/android/android-sdk_r11-windows.zip
http://dl.google.com/android/installer_r11-windows.exe
Mac OS X(intel)
http://dl.google.com/android/android-sdk_r11-mac_x86.zip
Linux(i386)
http://dl.google.com/android/android-sdk_r11-linux_x86.tgz
Android NDK r5b
Windows
http://dl.google.com/android/ndk/android-ndk-r5b-windows.zip
Mac OS X(intel)
http://dl.google.com/android/ndk/android-ndk-r5b-darwin-x86.tar.bz2
Linux
http://dl.google.com/android/ndk/android-ndk-r5b-linux-x86.tar.bz2
Android SDK 3.0
Windows
http://dl.google.com/android/installer_r10-windows.exe
http://dl.google.com/android/android-sdk_r10-windows.zip
Mac OS X(intel)
http://dl.google.com/android/android-sdk_r10-mac_x86.zip
Linux(i386)
http://dl.google.com/android/android-sdk_r10-linux_x86.tgz
Android SDK 2.3
Windows
http://dl.google.com/android/android-sdk_r08-windows.zip
http://dl.google.com/android/installer_r08-windows.exe
Linux (i386)
http://dl.google.com/android/android-sdk_r08-linux_86.tgz
MAC OS X (intel)
http://dl.google.com/android/android-sdk_r08-mac_86.zip
Android NDK r5
Windows
http://dl.google.com/android/ndk/android-ndk-r5-windows.zip
Mac OS X (intel) r5
http://dl.google.com/android/ndk/android-ndk-r5-darwin-x86.tar.bz2
Linux 32/64-bit (x86) r5
http://dl.google.com/android/ndk/android-ndk-r5-linux-x86.tar.bz2
Android Studio软件技术基础 —Android项目描述---1-类的概念-android studio 组件属性-+标志-Android Studio 连接真机不识别其他途径
版权声明:本文为博主原创文章,未经博主允许不得转载, 微信公众号『醉翁猫咪』特约作者
学习android对我来说,就是兴趣,所以我以自己的兴趣写出的文章,希望各位多多支持!多多点赞,评论讨论加关注。
最近有点忙碌,对于我来说,学习Android开发,是对于我的考验,最近一位大佬发给我一道题目,我既然无力解决,所以我也要加把劲了。
学习android的同学,一定要对java有所了解,再来学习。
android 类的概念 究竟什么类呢?
类的定义
定义的是一个类,把一个类实例话就生成了一个对象,这样讲你能明白么?对象就是你从这个类生成的变量。你用的是一个对象变量,而这个对象变量是根据你定义的类来生成的。(明白?,不明白?)
类(Class)实际上是对某种类型的对象变量和方法的原型。所以说类是从一些具有相同属性或功能的具体实例,抽象出共有的一些属性的,自定义抽象数据类型。(明白?不明白?)
重点 类,那么就让我们想象一下,把类想象成我们拿的手机,如果用java来描述,你会吗?是不是,如下表达:public class Mobile {….} 是不是这样呢? 类class 想象成手机就是 Mobile ,那么这里的 Mobile 是什么用呢? 这里的 Mobile 是一个抽象的概念,既是 Mobile 还没有定义对吧。在你们学习的java中,应该是
public class Mobile{ private Button mCallButton;
private String mPhoneNumber; protected void call(String phoneNumber){....}
这里的private是私有的意思,就是自己用吧,要不你看看书现在,理解一下private,定义了两个变量,就是手机有打电话的功能,Call(打),还有拨电话号码的功能,类就是这样的,定义什么对象,就定义什么属性即变量。
如果不同类型的手机各不相同,如何拨电话号码,此时可以用上Abstract:
public abstract class Mobile {//一个抽象类 protected Button callButton;//至少有一个打电话的按钮 protected String mPhoneNumber;//至少有能显示电话号码拨号盘 protected abstract boolean call(String phoneNumber); //没有实现拨电话号码的抽象方法
注意了:定义了抽象类,那么方法要加抽象方法。
android studio 组件属性 android:layout_width和android:layout_height属性
几乎每类组件都需要android:layout_width和android:layout_height属性
match_parent:视图与其父视图大小相同,wrap_content:视图将根据其内容自动调整大小。
根LinearLayout组件均为match_parent,其他界面布局中的组件 均被设置为wrap_content。
android:orientation属性 android:orientation属性决定了子组件是水平放置还是垂直放置。
android:text属性 android:text属性指定组件显示的文字内容。是对字符串资源(string resources)的引用。
从布局XML到视图对象 想知道XML元素是如何转换为视图对象的吗?答案就在于你定义的类中哦。
类中Activity子类的实例创建后,onCreate(Bundle)方法将会被调用。
public class QuizActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_quiz); } }
资源 布局是一种资源,如XML文件、图像文件以及音频文件等。
从Android视图切换到Project视图 app/build/generated/source/r/debug目录的内容,警告,不要改变它。那好像是R.java。
+标志 对了,这+是创建资源ID,对字符串只是做了引用。
Android Studio 连接真机不识别其他途径 连不上的原因有以下几种:
- 手机设置问题。
- 数据线问题。
- 是否下载了对应手机版本的SDK。
喜欢本文的朋友们,欢迎长按下图关注订阅号醉翁猫咪,收看更多精彩内容
我们今天的关于android – 登录网站和登录网站还是登陆网站的区别的分享就到这里,谢谢您的阅读,如果想了解更多关于2 年推广迈入新阶段,苹果 iOS 18 将自动升级 Passkey 登录网站 / App、Android - Android 面试题集 -- Android 部分答案、Android SDK Android NDK Android Studio 官方下载地址、Android Studio软件技术基础 —Android项目描述---1-类的概念-android studio 组件属性-+标志-Android Studio 连接真机不识别其他途径的相关信息,可以在本站进行搜索。
本文标签: