android学习笔记-activity(三大组件、四大布局)数据存储、sharedPreferences 、Fragment 、FragmentManager

.so -- shared object,用户层的动态库 。
.ko -- kernel object,内核模块,可以在Linux内核起来之后动态的加载和卸载。

四大布局:线性布局:LInearLayout 绝对布局:AbsoluteLayout 相对布局:RelativeLayout表格布局:TableLayout 帧布局FrameLayout (存在于activity 可以把其分为独立的模块)

数据存储:对处理后的数据进行存储或再次访问

  1. 文件 数据以文件形式存储 1.文本文件 2. xml
  2. sharedPreferences 类 存放软件配置参数(软件参数设置,方法调用)
  3. SQLIte 数据库 excel相似
  4. 内容提供者(content provider)对外共享数据提供
  5. 网络 网络保存数据

activity(三大组件) 服务 广播|接收器 activity类需要继承activity
intent的使用
组件与组件的通过是通过意图(intent)进行通信

Intent intent=new Intent(zujian.this,otheractivity.class);
  mainActivity.this.startActivity(intent);

  intent.setclass(mainActivity.this,otherActivity.class);  
  intent.setComponent(new componentName(...));
   new intent(mainActivity.this,otherActivity.class);

bundle=new Bundle(); 
bundle.putInt("id",10);
intent.putExtras(bundle);

activity 可以配置多个 但是入口mianactivity只有一个
//隐式意图 意图本身不知道要传递给哪个组件,至于传递给哪个组件是由andorid平台决定的
//如果提供了data 那么会跟filter器中的节点进行匹配
//节点如果只定义了内容类型,那么只要类型匹配就会交给对应组件处理

Intent intent=new Intent("cn.itcast.activity.itcast",Uri.parse("itcase://data/data/"))
intent.setType("image/gif");
<activity name=".Otheractiviy">
    <intent-filter>
        <category name="android.intent.category.DEFAULT">
        <data minmeType="image/*"/>

@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
    Log.i("MainActivity"," requestCode:"+requestCode+"resultCode:"+resultCode);
    if(resultCode == -1){
        Log.i("MainActivity"," requestCode:"+requestCode+"resultCode:"+resultCode);
    }
    super.onActivityResult(requestCode, resultCode, data);



活动 [activity ]
        OtherActivity.this.startActivityForResult(intent, 1);   
        Intent intents= OtherActivity.this.getIntent();
        Intent intents=new Intent();//数据用Intent返回
        intents.putExtra("params", "152390");
        OtherActivity.this.setResult(RESULT_OK,intents);
    //结果码标识结果来源 区分哪个组件传来的结果码

/**
* 显式意图:软件内部通信
* 隐式意图:软件之间通信
*
* activity 生命周期 有三个状态
* 当它在屏幕时 此时是激活或运行状态 他是响应用户的activity
* 当它失去焦点但是仍然对用户可见时 ,即在它智商有另外一个activity,这个activity也许是透明的,或者没全屏,
* 暂停(它保留着所有的状态和成员信息并保持和窗口管理器的连接,但系统处于极低内存时仍然可以杀死这个activity)
* 完全被覆盖则处于停止状态 和暂停相比 没有了窗口管理起的连接 如果其他地方需要内存,则系统经常会杀死这个
*
* 创建 启动 激活 运行 暂停 停止 销毁 重启
* create 创建 (设置全局初始化)
* start-restart-|
* 运行 –| |
* resume | |
* pause暂停 -| |
* stop —|
* destory (释放所有系统资源,例如下载)
* activity 的完整生命周期
* 可视生命周期自start调用至相应的stop调用结束
* 前台生命周期 自onresume调用起,至相应的onPause调用为止
* activity 会经常在暂停和恢复之间进行状态转换
* 当设备转入休眠状态或者有新的activity启动是,讲调用onpause(暂停)方法
* 当activity获得结果或接受到新的intent时会调用onresume(恢复)方法
* 照相机 只能一个activity操作它 所以
* 在resume开启照相机 在pause中释放它 下个应用就可以调用
*/
activity 生命周期
create[创建] –> start[启动] –> resume[运行] –> pause[暂停]
–> stop[停止] –> destory[销毁]
暂停:resume…
停止:1. onRestart –> start –> resume 2.被杀死的:create –> start…

1、当第一次调用一个Activity就会执行onCreate方法
2、当Activity处于可见状态的时候就会调用onStart方法
3、当Activity可以得到用户焦点的时候就会调用onResume方法
4、当Activity被遮挡住的时候就会调用onPause方法
5、当Activity处于不可见状态的时候就会调用onStop方法
6、当Activity没有被销毁的时候重新调用这个Activity就会调用onRestart方法
7、当Activity被销毁时会调用onDestory方法

打开第二个SecondActivity先执行MainActivity的onPause(),
再执行Second的onCreate()->onStart()->onResume(),
Second入栈,
最后执行MainActivity的onStop(),
此时Activity返回栈的栈顶为SecondActivity,
MainActivity被压入栈。
?
按下返回键,先执行SecondActivity的onPause(),
再执行MainActivity的onRestart()->onStart()->onResume(),
此时MainAcitivity回到栈顶,
待MainActivity重新回到栈顶并准备好与用户交互后,
SecondActivity才执行onStop()->onDestroy(),
此时SecondActivity()出栈。
?
在一个Activity交互时按下home键或打开任务面板时,
会执行该Activity的onPause()->onStop(),而不会执行onDestroy(),
当用户再此点开该程序后执行onRestart()->onStart()->onResume()恢复。

内容提供者[ContentProvider]
需要配置 继承 contenProvider

当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的getContentResolver()方法。

后台方法调用也需要匹配uri 并从中获取id 1/name 修改name

this.getContentResolver() 访问内容提供者
ContenResolver contenResolver =this.getContenResolver 用这个类获取内容提供者
uri uri=Uri.parse("content://cn.lina.pesonProvider/person")//person指得是person表操作全表

ContentValues value=new ContentViews();
value.put("key","value")
contenResolver .insert(uri,"添加的字段"==value);  根据uri调用相应的类insert方法
contenResolver .update(uri,value,null,null)

字符串转成URi

uri uri=Uri.parse("content://cn.lina.pesonProvider/person/3")
contenResolver .delete(uri,nullnull

一个应用实现ContentProvider来提供内容给别的应用来操作,

扫描二维码关注公众号,回复: 3176114 查看本文章

一个应用通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以。

内容提供者将一些特定的应用程序数据供给其它应用程序使用。内容提供者继承于ContentProvider 基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个 ContentResolver 对象,调用它的方法作为替代。ContentResolver可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。

主要方法:

public boolean onCreate() 在创建ContentProvider时调用
public Cursor query(Uri, String[], String, String[], String) 用于查询指定Uri的contentProvider(内容提供者),返回一个Cursor
public Uri insert(Uri, ContentValues) 用于添加数据到指定Uri的ContentProvider中
public int update(Uri, ContentValues, String, String[]) 用于更新指定Uri的ContentProvider中的数据
public int delete(Uri, String, String[]) 用于从指定Uri的ContentProvider中删除数据
public String getType(Uri) 用于返回指定的Uri中的数据的MIME类型

*如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头
*如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头。
例如:要得到id为10的person记录的Uri为content://contacts/person/10,那么返回的MIME类型字符串应为”vnd.android.cursor.item/person”。

1.继承 broadcastReceiver 重写onReceive方法
第二步:订阅感兴趣的广播 intent
第一种

IntentFileter filter =new intentfileter("android.provider.telephony.SMS_RECEIVED")
imcmingSMSReceiver receiver =new incomingSMSReceiver();
registerReceiver(receiver,filter)

第二种 在Androidmainfest application 节点订阅
<

receiver android:name=".IncomingSMSReceiver">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED[收到短信]" />

订阅广播意图

<action android: name="android.intent.action.BATTERY_CHANGED[电池_改变 ]">
        <action android: name="android.intent.action.BOOT_COMPLETED[开机启动]">

并且需要权限声明[接收。_完成启动]

<uses-permission android:name="andrroid.permission.RECEIVE.BOOT_COMPLETED">     

广播接收者的生命周期不超过五秒 如果需要完成一项比价耗时的工作 可以提供发送intent给activity或service由activity或service来完成
广播接受者(broadcastReceiver)用于异步接收广播intent
content.startactivity(intent) –> 只能被一个组件(activity/sevice)接收
content.sendbroadcast(intent) –> 能被订阅了此意图的所有广播接收者所接收

Tablelayout以行和列的形式对控件进行管理,每一行为一个TableRow对象,或一个View控件。
当为TableRow对象时,可在TableRow下添加子控件,默认情况下,每个子控件占据一列。
有多少个子控件就有多少列;当为View时,该View将独占一行,
属性和方法:
XML属性
备注
android:layout_colum
指定该单元格在第几列显示
android:layout_span
指定该单元格占据的列数(未指定时,为1)
android:stretchColumns
设置可伸展的列。该列可向行方向伸展,最多可占据一整行
android:shrinkColumns
设置可收缩的列。当该列子控件的内容太多,已经挤满所在行,那么该子控件的内容将往列方向显示
android:layout_colum
指定该单元格在第几列显示
android:layout_span
指定该单元格占据的列数(未指定时,为1)
android:stretchColumns
设置可伸展的列。该列可向行方向伸展,最多可占据一整行

android:layout_span=”2” android:text=”我占据2列”

Activity中有个FragmentManager,其内部维护fragment队列,以及fragment事务的回退栈。

FragmentManager fm = getSupportFragmentManager(); 
mContentFragment = (ContentFragment) fm.findFragmentById(R.id.id_fragment_container); 

//当Activity因为配置发生改变 屏幕旋转或者内存不足时会被杀死 造成重建的时候我们的fragment会保存下来 1.创建新的fragmentmanager 新的fragmanager会首先获取保存下来的消息队列,重建fragment队列,从而恢复之前的状态

if(mContentFragment == null ){ 
 mContentFragment = new?ContentFragment(); 
fm.beginTransaction().add(R.id.id_fragment_container,mContentFragment).commit(); 
} 
oncreate
Bundle?bundle = getArguments(); 
if (bundle != null) 
mArgument = bundle.getString(ARGUMENT);

//?传入需要的参数,设置给arguments 
publicstaticContentFragment?newInstance(String?argument){
Bundle bundle = new Bundle(); 
bundle.putString(ARGUMENT, argument); 
ContentFragment?contentFragment=new?ContentFragment();
contentFragment.setArguments(bundle); 
return?contentFragment; 
}

setArguments方法必须在fragment创建以后,
添加给Activity前完成。千万不要,首先调用了add,然后设置arguments。

onAttach(Activity)
当Fragment与Activity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
创建该Fragment的视图
onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用
注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现,

SharedPreferences
适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口 令密码等
核心原理:保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。通过DDMS的File Explorer面板,展开文件浏览树,很明显SharedPreferences数据总是存储在/data/data//shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。?SharedPreferences本身是一 个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例,该方法中name表示要操作的xml文件名,第二个参数具体如下:

Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写。

Context.MODE_WORLD_READABLE:??指定该SharedPreferences数据能被其他应用程序读,但不能写。

Context.MODE_WORLD_WRITEABLE:??指定该SharedPreferences数据能被其他应用程序读,写
Editor有如下主要重要方法:
SharedPreferences.Editor clear():清空SharedPreferences里所有数据
SharedPreferences.Editor putXxx(String key , xxx value): 向SharedPreferences存入指定key对应的数据,其中xxx 可以是boolean,float,int等各种基本类型据
SharedPreferences.Editor remove(): 删除SharedPreferences中指定key对应的数据项
boolean commit(): 当Editor编辑完成后,使用该方法提交修改

平时直接重写Fragment,inflate加载布局完成相应业务
对话框:DialogFragment
列表:ListFragment
选项设置:PreferenceFragment
WebView界面:WebViewFragment
fragment v4包和app包都可以用 只不过v4包最低可以兼容1.6版本

静态加载fragment
1.fragment xml布局文件
2.自定义fragment 需继承fragment或其子类 实现onCreateView 提供inflater.inflate加载布局文件
3.在需要加载fragment的activity的布局文件中 name指向的这个fragment子类
4.activity调用setContextView即可

fragment类就是显示内容的 定义布局 name指向这个类

Display dis = getWindowManager().getDefaultDisplay();
      if(dis.getWidth() > dis.getHeight()){
         Fragment1 f1 = new Fragment1();
           getFragmentManager().beginTransaction().replace(R.id.LinearLayout1, f1).commit();
        }

activity管理fragment主要依靠fragmentMAnager可以调用findFragmentById获取指定的fragment
也可以调用popBackStack弹出后台fragment 也可以调用addToBackStack(null)加入栈
或者监听后台栈的变化

猜你喜欢

转载自blog.csdn.net/qq_36047372/article/details/78970938
今日推荐