传知_16_android

组件

Activity

ContentProvider

BroadcastReceiver

服务

 

意图用于 激活 各种组件的

 

 

输入以下命令再开启一个Android模拟器:

  emulator -data itcast 

 

 

一个Activity调用另一个Activity

public void onClick(View v) {

Intent  in = new Intent(ex12.this ,  rgActivity.class) ;

startActivityForRecult(in ,  RG_REQUEST) ;

}

 

地图功能:

extends MapActivity

 

拨号

<uses-permission android:name="android.permission.CALL_PHONE"/>

 

LinearLayout (线性布局)AbsoluteLayout(绝对布局)RelativeLayout(相对布局)TableLayout(表格布局)FrameLayout(帧布局)

 

Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+ editText.getText()));

                DialerAction.this.startActivity(intent);

 

内部类使用final ,防止其他类继承

 

SMS

<uses-permission android:name="android.permission.SEND_SMS"/>

SmsManager smsManager = SmsManager.getDefault();

smsManager.sendTextMessage(mobile, null, msg, sentIntent, null);

          //最后二个参数为短信已发送的广播意图,最后一个参数为短信对方已收到短信的广播意图

//第二个参数是短信终生地址

Toast.makeText(SMSSender.this, "短信发送完成", Toast.LENGTH_LONG).show();

 

状态栏通知

对话框通知

吐西通知

 

htmlView

webview.setSettings.setJavaScriptEnabled(true) ;

webview.addJavascriptInterface(obj , "tacast") ;

js:itcast     //an droid里调用其js对象

webview.loadUrl("file:///android_asset/index.html");

jsondata = [{1,23,43,65,45},{ ... },{ ...  }] ;

var jsonobject = eval(jsondata) ;               //把字符串转换为json对象

 

webview.loadUrl("javascript:show()") ;            //

 

编码显示UI

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(

                    ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

        linearLayout.addView(textView, params);

       

        params = new LinearLayout.LayoutParams(

                    ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);

        setContentView(linearLayout, params);

 

单元测试

<uses-library android:name="android.test.runner" />

<instrumentation android:name="android.test.InstrumentationTestRunner"

  android:targetPackage="cn.itcast.action" android:label="Tests for My App" />

日志信息

Log.i(TAG, "www.itcast.cn");

 

添加新的Activity

 class NewActivity extends Activity

<activity android:name=".NewActivity" android:label="activity的页面标题"/>

Activity有三个状态:

 当它在屏幕前台时(位于当前任务堆栈的顶部),它是激活或运行状态。它就是响应用户操作的Activity

 当它上面有另外一个Activity,使它失去了焦点但仍然对用户可见时(如右图),它处于暂停状态。在它之上的Activity没有完全覆盖屏幕,或者是透明的,被暂停的Activity仍然对用户可见,并且是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接)。如果系统处于内存不足时会杀死这个Activity

当它完全被另一个Activity覆盖时则处于停止状态。它仍然保留所有的状态和成员信息。然而对用户是不可见的,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个Activity

 

系统提供的对话框主题:

android:theme = "@android:style/Theme.Dialog"

 

xml文件开头不能大写

 

当系统要杀死当前Activity时,此两方法就调用:

Activity onSaveInstanceState() onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。

 

onSaveInstance()  onRestoreInstanceState()

name = savedInstanceState.getString("name"); //被重新创建后恢复缓存的数据

protected void onSaveInstanceState(Bundle outState) {

         outState.putString("name", "liming");//被摧毁前缓存一些数据

         super.onSaveInstanceState(outState);

}                  //这里的Bundle 是会序列化到磁盘的

 

使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。

Intent可以划分成显式意图和隐式意图。

显式意图 应用于本应用,隐式意图可以应用之间

显式意图:调用Intent.setComponent()Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。

隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

意图可以有多个类别,动作名称只有一个

 

显式意图三种写法:

Intent  intent = new Intent(MainActivity.this ,  OtherActivity.class) ;

 

Intent  intent = new Intent() ;

intent.setClass(MainActivity.this , OtherActivity.class) ;

 

Intent  intent = new Intent() ;

intent.setComponentName(MainActivity.this , OtherActivity.class) ;

 

 

数据存储与访问

文件 (xml.)

SharedPreferences(参数)

SQLite数据库

内容提供者(Content provider

网络

 

创建的文件保存在/data/data/<package name>/files目录,如: /data/data/cn.itcast.action/files/itcast.txt

filecontentText.getText().toString()  //不要少了getText()

 

文件访问权限:  other

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND

Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。

Context.MODE_WORLD_READABLEContext.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。

MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

如果希望文件被其他应用读和写,可以传入:

openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

 

android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。

 

String path = "/data/data/cn.itcast.set/shared_prefs/itcast.xml"

Activity还提供了getCacheDir()getFilesDir()方法:

getCacheDir()方法用于获取/data/data/<package name>/cache目录

getFilesDir()方法用于获取/data/data/<package name>/files目录

 

FileOutputStream outStream = new FileOutputStream(file , true);

//还要指定这个,才能真正追回模式

 

SD卡的路径:

android 2.2          /mnt/sdcard  (也可以采用/sdcard,自动镜像)

android 2.2以前          /sdcard

 

this.getContext().getFilesDir()

 

File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))   //判断SD卡是否在手机上及是否有写保护

AndroidManifest.xml中加入访问SDCard的权限如下:

<!-- SDCard中创建与删除文件权限 -->

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!-- SDCard写入数据权限 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 

使用SAX或者DOM或者pull解析XML文件

 

 

 

取得其他包的上下文对象:

Context  otherContext  =  this.getContext().createPackageContext("cn.itcast.set" , Context.CONTEXT_IGNORE_SE)

 

SQLite

SQLite3支持 NULLINTEGERREAL(浮点数字)、TEXT(字符串文本)BLOB(二进制对象)数据类型,

虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)char(n)decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。

SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。

例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。

但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。

 

 

SQLiteOpenHelper

getWritableDatabase()getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例 (主要创建这两对象其中一个,都会帮你创建..

 

@Override public void onCreate(SQLiteDatabase db) {

              db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");  

         }

        @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

               db.execSQL(" ALTER TABLE person ADD phone VARCHAR(12) NULL "); //往表中增加一列

         // DROP TABLE IF EXISTS person 删除表

       }

 

自动创建数据库,

getWritableDatabase

getReadableDatabase 

 

db.execSQL

db.rawQuery

 

cusor.moveNext() JDBC中的rs.next()是等价的

 

事务:

try {

db.beginTransaction()

d.setTransaction()

}

finally {

db.entTransaction()

}

 

绑定数据:

SimpleAdapter

SimpleCursorAdapter

 

内容提供者:  DB

好处:统一了数据的访问方式。

配置:

<provider android:name=".Cone" android:authorities="cn.itcast.providers.cone" />

ContentProvider

//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码

UriMatcher  sMatcher = new UriMatcher(UriMatcher.NO_MATCH);

//如果match()方法匹配content://cn.itcast.provider.personprovider/person路径,返回匹配码为1

sMatcher.addURI(cn.itcast.provider.personprovider, person, 1);//添加需要匹配uri,如果匹配就会返回匹配码

//如果match()方法匹配content://cn.itcast.provider.personprovider/person/230路径,返回匹配码为2

sMatcher.addURI(cn.itcast.provider.personprovider, person/#, 2);//#号为通配符

switch (sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10"))) {

ContentUris

 

android:name="CallLogProvider"   通话记录的

android:name="ContactsProvider2 通讯录

加入读写联系人信息的权限

<uses-permission android:name="android.permission.READ_CONTACTS" />

<uses-permission android:name="android.permission.WRITE_CONTACTS" />

加入读取联系人信息的权限

<uses-permission android:name="android.permission.READ_CONTACTS"/>

content://com.android.contacts/contacts 操作的数据是联系人信息Uri

content://com.android.contacts/data/phones 联系人电话Uri

content://com.android.contacts/data/emails 联系人Email Uri

 

向通信录 添加 删除 contact

 

使用ContentProvider(内容提供者)共享数据

如果采用文件操作模式对外共享数据,数据的访问方式会因数据存储的方式而不同,导致数据的访问方式无法统一,如:采用xml文件对外共享数据,需要进行xml解析才能读取数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读取数据。

使用ContentProvider对外共享数据的好处是统一了数据的访问方式。

 

<providerandroid:name=".PersonContentProvider" android:authorities="" />

Uri代表了要操作的数据,Uri主要包含了两部分信息:1》需要操作的ContentProvider 2》对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:

要操作person表中id10的记录,可以构建这样的路径:/person/10

要操作person表中id10的记录的name字段, person/10/name

要操作person表中的所有记录,可以构建这样的路径:/person

要操作xxx表中的记录,可以构建这样的路径:/xxx

 

当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:

要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name

如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:

Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")

 

UriMatcher类使用

//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码

UriMatcher  sMatcher = new UriMatcher(UriMatcher.NO_MATCH);

//如果match()方法匹配content://cn.itcast.provider.personprovider/person路径,返回匹配码为1

sMatcher.addURI(cn.itcast.provider.personprovider, person, 1);//添加需要匹配uri,如果匹配就会返回匹配码

//如果match()方法匹配content://cn.itcast.provider.personprovider/person/230路径,返回匹配码为2

sMatcher.addURI(cn.itcast.provider.personprovider, person/#, 2);//#号为通配符

switch (sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10"))) {

   case 1

    break;

   case 2

    break;

   default://不匹配

    break;

}

 

ContentUris类使用

ContentUris类用于获取Uri路径后面的ID部分,它有两个比较实用的方法:

withAppendedId(uri, id)用于为路径加上ID部分:

Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")

Uri resultUri = ContentUris.withAppendedId(uri, 10);

//生成后的Uri为:content://cn.itcast.provider.personprovider/person/10

 

parseId(uri)方法用于从路径中获取ID部分:

Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person/10")

long personid = ContentUris.parseId(uri);//获取的结果为:10

 

this.getContext().getContenResolver() ;

 

 

 

 

 

通信录操作:

加入读写联系人信息的权限

<uses-permission android:name="android.permission.READ_CONTACTS" />

<uses-permission android:name="android.permission.WRITE_CONTACTS" />

 

访问网络权限:

<uses-permission android:name="android.permission.INTERNET"/>

 

 

<ScrollView />  滚动条控件

 

 

 

创建的Activity要放到 主包或主包的子包下,

Intert  intent = new Intent(MainActivity.this , OtherActivity.class) ;

startActivity(intent) ;

startActivityForResult(intnet , 100)

 

Activity间数据传递

putExtra    get..

Bundle       //批量

setResult

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

折腾数据折腾代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值