android基础

一、Activity *******************************
1.Activity生命周期(↖↑↗ ← → ↙↓↘)
--↓--onCreate();
--↓--onStart(); ←←←←←←↑
--↓--onResume();←←←↑  ↑
--↓-- 运行中   ↑  onRestart();
--↓--onPause(); →→→↑  ↑
--↓--onStop(); →→→→→→↑
--↓--onDestroy();

* 当第一次运行时会看到主Activity,主Activity可以通过Intent到其他的Activity进行相关操作。
* 当启动其他的Activity时当前的Activity将会停止,之前的Activity失去焦点,新的Activity会获取焦点
* 根据栈的先进后出原则,当按Back键时,当前这个Activity销毁,前一个Activity重新恢复,调用onResume
* 当按Home键退回到主界面时,会调用onStop,界面消失,重新进来会调用onRestart

2.设置页面
1)设置xml布局文件
setContentView(R.layout.xxx_xxx);
2)写View(LayoutParams一定要和父布局的一致)
TextView textView = new TextView(this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
params.leftMargin = 10;
params.rightMargin = 10;
textView.setLayoutParams(params);
textView.setTextSize(20);
textView.setPadding(100,20,0,20); // 左上右下
textView.setBackgroundColor(Color.parseColor("#D4D4D4"));

// setFrame(x - 60, y - 120, x + 60, y); // ImageView设置在父布局中位置

3.关闭Activity
finish();

4.页面跳转及传值
1)单向传值:
* 放值
Intent intent = new Intent(TabSpec3Acty.this, TabSpec3GoActy.class);
intent.putExtra("intentFlag", 0);
intent.putExtra("title", "修改姓名");
startActivity(intent);
* 取值
Intent intent = getIntent();
int intentFlag = intent.getIntExtra("intentFlag",-1);
String title = intent.getStringExtra("title");

2)数值回调:
* 等值
startActivityForResult(intent, 0); // 0是requestCode
* 放值
Intent intent = new Intent();
intent.putExtra("resultIntentFlag",intentFlag);
setResult(101,intent); // 101是resultCode
finish();
* 取值
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {}

5.Fragment
1)Fragment
--↓--onAttach();
--↓--onCreate();
--↓--onCreateView();
--↓--onActivityCreate();

--↓--onStart();
--↓--onResume();←←←↑
--↓-- 运行中   ↑
--↓--onPause(); →→→↑
--↓--onStop();

--↓--onDestroyView();
--↓--onDestroy();
--↓--onDetache();

2)主Activity继承FragmentActivity
3)获取事务处理,进行增加、替换、或者隐藏,最后提交
FragmentTransaction fts = getSupportFragmentManager().beginTransaction();
fts.add(R.id.content, tab1); // 资源可以用FrameLayout,或者ViewPager
// fts.replace(R.id.content, tab1); // 替换
fts.commit();
4)继承Fragment,重写onCreateView方法
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
if(view == null){
view = inflater.inflate(R.layout.acty_test,container,false);
}
return view;
}
5)得到上下文
Context context = this.getActivity();
6)操作Activity里面的东西
((FrameActy)getActivity()).refreshPage();
7)当Fragment相互切换的时候,会调用onHiddenChanged
会先调用activity的onResume


二、Intent *******************************
1.定义
作为一种意图,Activity,Service和Broadcast Receiver这三种核心组件都需要使用Intent来激活
Intent包含组件名称、动作、数据、种类、额外和标记等内容
2.动作(setAction()和getAction())
1)Activity:通常使用context.startActivity();启动
2)Broadcast:通常使用context.registerReceiver();启动
3.数据(setData()和getData())
4.种类(addCategory()和removeCategory())
5.额外(putExtra()和getExxxxtra())

6.返回桌面
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        startActivity(intent);

7.拨打电话
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:"+"15951723371"));
        startActivity(intent);

8.打开网页
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("http://www.baidu.com"));
        startActivity(intent);

三、事件处理 *******************************
1.按钮点击事件(setOnClickListener或者setOnLongClickListener)
        kaishi.setOnLongClickListener(new View.OnLongClickListener() {}); 
kaishi.setOnClickListener(new View.OnClickListener() {});

2.物理按键按下(重写onKeyDown(),返回值就是是否执行完毕)
1)屏蔽返回键
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
return true;
}
return super.onKeyDown(keyCode, event);
}
3.触摸事件(重写onTouch(),返回值就是是否执行完毕)
1)触摸事件
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
downX = event.getRawX();
downY = event.getRawY();
break;
case MotionEvent.ACTION_MOVE: // 监听拖动
moveX = event.getRawX();
moveY = event.getRawY();
break;
case MotionEvent.ACTION_UP: // 监听滑动
upX = event.getRawX();
upY = event.getRawY();
x = upX - downX;
y = upY - downY;


if(y < 0 && Math.abs(y) >= Math.abs(x)){
Toast.makeText(this, "向上滑动", Toast.LENGTH_SHORT).show();
}else if(y > 0 && y >= Math.abs(x)){
Toast.makeText(this, "向下滑动", Toast.LENGTH_SHORT).show();
}else if(x > 0 && x > Math.abs(y)){
Toast.makeText(this, "向右滑动", Toast.LENGTH_SHORT).show();
}else if(x < 0 && Math.abs(x) > Math.abs(y)){
Toast.makeText(this, "向左滑动", Toast.LENGTH_SHORT).show();
}
break;
}
return true;
}

注:getX getRawX的区别
getX:是以widget左上角为坐标原点,计算的X轴坐标值
getRawX:是以屏幕左上角为坐标原点,计算的X轴坐标值


四、资源访问(不能大写,字 下数 命名) *******************************
1.字符串(string)
textView.setTextColor(getResources().getString(R.string.app_name));
android:text="@string/app_name"

2.颜色(color):颜色值通过RGB和透明度Alpha表示,可以用#RGB、#ARGB、#RRGGBB、#AARRGGBB表示
textView.setTextColor(getResources().getColor(R.color.red));
android:textColor="@color/red"
        
3.尺寸(dimen)
textView.setTextSize(getResources().getDimension(R.dimen.margin));
android:textSize="@dimen/margin"

4.布局(layout)
* 布局中包含其他布局:
<include layout="@layout/acty_top"/>

5.数组(array)
1)类型:
<array>:普通类型数组
<integer-array>:整形数组
<string-array>:字符串数组
2)定义:
<integer-array name="asdf">
<item>111</item>
<item>222</item>
</integer-array>
3)使用:
int[] asdf =  getResources().getIntArray(R.array.asdf);
String[] qwer = getResources().getStringArray(R.array.qwer);

6.图片(drawable)
1).9图片的使用
2)虚拟图片
(1)两张图片切换
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/sdf"/>
<item android:state_pressed="true" android:drawable="@drawable/sdf"/>
</selector>
(2)单一背景
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#ffffff" />
<stroke android:width="1px" android:color="#C0BFB6" />
<corners android:radius="5px"/>
</shape>
</item>
</selector>
(3)去边
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:top="-2px">
<shape>
xxx
</shape>
</item>
</layer-list>

7.样式(style)
1)样式支持继承:优先使用子样式
2)定义:
<style name="title" parent="basic">
<item name="android:padding">10px</item>
<item name="android:gradientRadius">center</item>
</style>
3)使用:
style="@style/title"

8.主题(theme)
1)定义资源color,attr,style
<color name="color_gray">#3b3b3b</color>
<attr name="main_color_normal" format="reference|color"/>


<style name="ThemeBlue" parent="AppTheme">
<item name="main_color_normal">@color/color_blue</item>
</style>
2)自定义MyApplication类,继承Application,存放curThemeId值,并生成getter,setter方法
3)AndroidManifest文件,name实现MyApplication类,修改默认android:theme="@style/ThemeBlue"
4)修改主题
1.设置主题,要在setContentView方法之前
setTheme(((MyApplication) getApplication()).getCurThemeId());
2.向MyApplication里面放值
((MyApplication) getApplication()).setCurThemeId(curTheme);
3.页面重新创建
recreate();
5)其他
1.设置属性默认背景
android:background="?main_color_normal"
2.拿到资源颜色转
int color = context.getResources().getColor(colorArr[i]);
3.拿到属性默认颜色
int mainColor = Utils.getThemeColor(this,R.attr.main_color_normal,R.color.color_blue);
6)工具类
// dip转px
public static float dipToPx(Context context, float dipValue) {
float scale = context.getResources().getDisplayMetrics().density;
return dipValue * scale + 0.5f;
}
// px转dip
public static float pxToDip(Context context, float pxValue) {
float scale = context.getResources().getDisplayMetrics().density;
return pxValue / scale + 0.5f;
}
// 得到当前主题颜色
public static int getThemeColor(Context mContext, int attr, int defaultColor){
TypedArray array = mContext.obtainStyledAttributes(new int[]{attr});
return array.getColor(0, defaultColor);
}
9.原始xml(xml)
建文件夹xml

=======================================================================================================================
==================================================分割线-高级==========================================================
=======================================================================================================================

五、图形图像处理 *******************************
1.常用绘图类
1)Paint(画笔)
paint = new Paint();
paint.setAntiAlias(true); // 去锯齿
paint.setColor(Color.BLUE); // 设置画笔颜色
paint.setStyle(Paint.Style.STROKE); // 描边,填充的属性为 Paint.Style.FILL
paint.setStrokeWidth(3); // 路径宽度
paint.setTextSize(18); // 设置字体大小
2)Canvas(画图面板)
canvas.drawColor(Color.GRAY); // 设置画布颜色
3)Bitmap(Bitmap类代表位图)
4)BitmapFactory(从不同数据源来解析、创建Bitmap对象)
Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/picture/bccd/img01.jpg"); // 从路径解析Bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher); // 从资源解析Bitmap
Bitmap bitmap = BitmapFactory.decodeStream(inputStream); // 输入流解析Bitmap


2.绘制2D图像
1)绘制几何图形
canvas.drawPoint(100, 100, paint); // 绘制点(坐标)
canvas.drawLine(10,10,40,40,paint); // 绘制线(开始坐标,结束坐标)
canvas.drawCircle(10, 10, 12, paint); // 绘制圆(圆心坐标,半径)
canvas.drawRect(10,10,50,50,paint); // 绘制方(左上角坐标,右下角坐标)
canvas.drawOval(new RectF(0,0,100,60),paint); // 绘制椭圆(左上角坐标,右下角坐标)

2)绘制文本
canvas.drawText("张三",10,460,paint); // 绘制文本(左下角起始坐标)

3)绘制路径
Path path = new Path(); // 绘制路径
path.moveTo(30,0); // 起始点
path.lineTo(0,44); // 路径
path.lineTo(60,44);
path.close(); // 闭合路径,如果写了,就会闭合
canvas.drawPath(path,paint);

canvas.drawTextOnPath("xxx",path,0,0,paint); // 沿着路径绘制文字

4)绘制图片
canvas.drawBitmap(bitmap, 100, 100, paint); // 从指定点绘制位图(左上角坐标)

Rect src = new Rect(0, 0, 300, 500);
Rect dst = new Rect(50, 50, 350, 350);
canvas.drawBitmap(bitmap, src, dst, paint); // 从源位图上挖取(0,0)到(300,500)的一块图像,然后绘制到(50,50)到(350,550)区域


3.逐帧动画
1)写配置文件anim_frame_panda,oneshot表示循环,默认为true,
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item  android:drawable="@mipmap/fat_po_f01" android:duration="60" />
</animation-list>
2)ImageView的Background属性设置为配置文件,或者在Java里面设
android:background="@anim/anim_frame_panda"
imageView.setBackgroundResource(R.anim.anim_frame_boom);
3)拿到ImageView的background,并强转为AnimationDrawable,并启动
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();
animationDrawable.start();
animationDrawable.stop();


4.补间动画
1)代码显示
(1)位移动画
TranslateAnimation translateAnimation = new TranslateAnimation(0, 400, 0, 200); // x开始,x位移,y开始,y位移
translateAnimation.setDuration(1000); // 执行动画时间
translateAnimation.setFillAfter(false); // 是否停留在最后状态
translateAnimation.setRepeatCount(1); // 设置重复次数,连同本身一共两次
translateAnimation.setRepeatMode(Animation.REVERSE); // 反向执行
imageView.startAnimation(translateAnimation); // 开始动画
(2)缩放动画
ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f); // x开始,x缩放,y开始,y缩放
scaleAnimation.setDuration(800); // 执行动画时间
scaleAnimation.setRepeatCount(2); // 设置重复次数,连同本身一共三次
scaleAnimation.setRepeatMode(Animation.REVERSE); // 反向执行
imageView.startAnimation(scaleAnimation); // 开始动画
(3)旋转动画
RotateAnimation rotateAnimation = new RotateAnimation(0, 360, 100, 100); // 开始度数,旋转度数,圆心
rotateAnimation.setDuration(800); // 执行动画时间
// rotateAnimation.setInterpolator(new LinearInterpolator()); //均匀速度改变
// rotateAnimation.setInterpolator(new AccelerateInterpolator()); //先慢后快
// rotateAnimation.setInterpolator(new DecelerateInterpolator()); //先快后慢
rotateAnimation.setInterpolator(new AccelerateDecelerateInterpolator()); //先慢后快
rotateAnimation.setStartTime(100); //等待100ms执行
rotateIV.startAnimation(rotateAnimation); // 开始动画
(4)透明、渐变动画
AlphaAnimation alphaAnimation = new AlphaAnimation(0.1f, 1f); // 开始透明度,结束透明度
alphaAnimation.setDuration(2000); // 执行动画时间
alphaAnimation.setFillAfter(true); // 是否停留在最后状态
alphaIV.startAnimation(alphaAnimation);


alphaAnimation.setAnimationListener(new Animation.AnimationListener() {}); // 设置监听
2)xml显示(新建directory -> anim)
(1)位移动画
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="400"
android:toYDelta="100"
android:duration="1000">
</translate>
TranslateAnimation translateAnimation = (TranslateAnimation) AnimationUtils.loadAnimation(this,R.anim.anim_translate);
(2)缩放动画
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:toXScale="2.0"
android:toYScale="2.0"
android:pivotX="50%" // 缩放圆心
android:pivotY="50%"
android:duration="1000">
</scale>
ScaleAnimation scaleAnimation = (ScaleAnimation) AnimationUtils.loadAnimation(this,R.anim.anim_scale);
(3)旋转动画
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fillAfter="true"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="720">
</rotate>
RotateAnimation rotateAnimation = (RotateAnimation) AnimationUtils.loadAnimation(this,R.anim.anim_rotate);
(4)透明、渐变动画
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3500"
android:fromAlpha="0.1"
android:toAlpha="1"
android:fillAfter="true">
</alpha>
AlphaAnimation alphaAnimation = (AlphaAnimation) AnimationUtils.loadAnimation(this,R.anim.anim_alpha);
3)页面平滑动画
(1)写四个动画(anim_left_out)
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="-100%"
android:duration="400">
</translate>
(2)onCreate方法里面写
overridePendingTransition(R.anim.anim_right_in, R.anim.anim_left_out); // 动画进来的效果,动画出去的效果
(3)finish方法里面写
overridePendingTransition(R.anim.anim_left_in, R.anim.anim_right_out);


六、多媒体应用 *******************************
1.MediaPlayer播放音频 ↖↑↗ ← → ↙↓↘
1)MediaPlayer周期
new()或reset() →  → setDataSource() →  → prepare() →  → start()
如果调用create(),会直接进入准备状态

2)主要方法
mediaPlayer.reset(); // 重置资源
mediaPlayer.setDataSource(); // 设置播放资源
mediaPlayer.prepare(); // 准备
mediaPlayer.start(); // 开始
mediaPlayer.pause(); // 暂停
mediaPlayer.stop(); // 停止
mediaPlayer.release(); // 释放资源

mediaPlayer.getDuration(); // 得到播放时间
mediaPlayer.seekTo(); // 从哪边开始播放
mediaPlayer.getCurrentPosition(); // 得到当前位置

2.SoundPool播放音频
3.VideoView播放视频
4.用MediaPlayer和SurfaceView播放视频


七、线程 *******************************
1.多线程
1)线程创建
Thread thread = new Thread(new Runnable() {});

2)线程开启
thread.start();

3)线程休眠
thread.sleep(200);

2.Handle消息传递
1)Handle作用
(1)在子线程与主线程进行通信
(2)在主线程中操作UI控件

2)Handle创建,并实现handleMessage接受消息
Handler handler = new Handler(){
public void handleMessage(Message msg) {
}
};

3)发送消息给handle
handler.sendMessage(message); // 发送带有Message的消息
handler.sendEmptyMessage(0x12); // 发送一个空的信息

4)Message
Message message = Message.obtain();
message.arg1 = 1;
message.arg2 = 1;
message.obj = obj;
message.what = 0x12;


八、数据存储
  1.SharedPreference(xml文件):用于存储较简单的数据
1)定义并设权限
SharedPreferences spf = getSharedPreferences("user",Activity.MODE_PRIVATE);

2)放值
spf.edit()
spf.putString("name","张三")
spf.commit();

3)取值
String name = spf.getString("name","");

4)清空
spf.edit()
spf.clear()
spf.commit();

  2.File(文件):用于存储大数量的数据,缺点是更新数据困难
1)文件读取
            FileInputStream fis = this.openFileInput(FILE_NAME);
            byte[] buff = new byte[1024];
            int hasRead = 0;
            StringBuilder sb = new StringBuilder("");
            while ((hasRead = fis.read(buff)) > 0) {
                sb.append(new String(buff, 0, hasRead, "utf-8"));
            }

2)文件写入
            FileInputStream fis = this.openFileInput(FILE_NAME);
            byte[] buff = new byte[1024];
            int hasRead = 0;
            StringBuilder sb = new StringBuilder("");
            while ((hasRead = fis.read(buff)) > 0) {
                sb.append(new String(buff, 0, hasRead, "utf-8"));
            }
 
3.SQLite(轻量级数据库):支持基本SQL语法,是常被采用的一种数据存储方式
1)创建连接以及创表类,继承SQLiteOpenHelper
private static String dbName = "data.db";
private static int version = 1;
public final static String T_USER = "t_user";


public DataDBHelper(Context context){
super(context,dbName,null,version);
}
// 创建数据表,只在第一次运行的时候执行
@Override
public void onCreate(SQLiteDatabase db) {
StringBuffer createTableSql = new StringBuffer("");
createTableSql.append(" create table if not exists " + T_NOTE + " ");
createTableSql.append(" ( ");
createTableSql.append(" _id integer primary key autoincrement,");
createTableSql.append(" name varchar, ");
createTableSql.append(" ) ");


db.execSQL(createTableSql.toString());
}
// 更新数据库,新版本号比老版本号高的时候更新数据表
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
sqLiteDatabase.execSQL("drop table " + T_NOTE);
onCreate(sqLiteDatabase);
}

2)写增删改查类
// 类型定义
private SQLiteHelper sqliteHelper;
public SQLiteDBManager(Context context) {
if (sqliteHelper == null) {
sqliteHelper = new SQLiteHelper(context);
}
}

// 增删改
SQLiteDatabase db = sqliteHelper.getWritableDatabase();
db.execSQL(sql, new Object[]{});
db.close();

// 查
SQLiteDatabase db = sqliteHelper.getReadableDatabase();
Cursor cursor = db.rawQuery(sql, null);
while (cursor.moveToNext()) {
cursor.getInt(cursor.getColumnIndex("_id"));
}
cursor.close();
db.close();

// 包装类增、删、改
ContentValues cv = new ContentValues();
cv.put("_id", this.queryMaxId());
db.insert("table_name", null, cv);

db.delete("table_name", " _id = ? ", new String[]{String.valueOf(item.getId())});


ContentValues cv = new ContentValues();
cv.put("_id", item.getId());
db.update("table_name", cv, " _id = ? ", new String[]{String.valueOf(item.getId())});







九、Service *******************************
1)生命周期
(1)启动 (2)绑定
-↓-onCreate(); -↓-onCreate();
-↓-onStartCommand(); -↓-onBind();
-↓-onDestroy(); -↓-onUnBind();
-↓-onDestroy();


2)注册Service
        <service android:name=".MyService">
            <!-- 优先级[-1000,1000] -->
            <intent-filter android:priority="900">
                <action android:name="com.suwei.someaction" />
            </intent-filter>
        </service>


3)启动Service
Intent intent = new Intent("com.suwei.someaction");

startService(intent);
stopService(intent);

4)绑定Service
        Intent intent = new Intent(mContext, MyService.class);
// 绑定或解绑
        bindService(intent, conn, Service.BIND_AUTO_CREATE);
unbindService(conn);

// ServiceConnection匿名链接对象
private MyService myService;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
MyService.MyBind bind = (MyService.MyBind) iBinder;
myService = bind.getMyService();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};

// Service的onBind方法每次return新的MyBind对象
@Override
public IBinder onBind(Intent intent) {
return new MyBind();
}

public class MyBind extends Binder {
public MyService getMyService() {
return MyService.this;
}
}


十、Broadcast *******************************
1.注册方法
1)静态注册(继承BroadcastReceiver)
<receiver android:name=".FirstReceive">
<!-- 优先级[-1000,1000] -->
<intent-filter android:priority="998">
<action android:name="qqq"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
2)动态注册(可以使用匿名对象或者类继承BroadcastReceiver)
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if ("name".equals(action)) {
Log.e("收到广播", "=========修改名字为========= " + intent.getStringExtra("name"));
} else if ("age".equals(action)) {
Log.e("收到广播", "=========修改年龄为========= " + intent.getStringExtra("age"));
} else if ("sex".equals(action)) {
Log.e("收到广播", "=========修改性别为========= " + intent.getStringExtra("sex"));
}
}
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("name");
intentFilter.addAction("age");
intentFilter.addAction("sex");

// 注册receive
registerReceiver(receiver, intentFilter);
// 解注册receive
unregisterReceiver(receiver);

2.分类
1)普通广播
Intent intent = new Intent();
intent.setAction("receive_action1");
intent.putExtra("name","张三");
sendBroadcast(intent);
2)有序广播(等前一个接受者处理完后才会发送给后一个接受者)
intent = new Intent();
intent.setAction("receive_action2");
intent.putExtra("kkk", "111");
sendOrderedBroadcast(intent, null);

// 截断广播
abortBroadcast();

// 前一个receive放其他的值
Bundle bundle = new Bundle();
bundle.putString("msg","第一个页面的信息");
setResultExtras(bundle);

// 后一个receive取值
String msg = getResultExtras(true).getString("msg");
3.系统广播
// 时间改变广播(只能动态注册)
SystemChangeReceive systemChangeReceive = new SystemChangeReceive();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_TIME_TICK);
registerReceiver(systemChangeReceive, filter);

// 网络状态广播(动态静态都可以)
NetChangeReceive netChangeReceive = new NetChangeReceive();
IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(netChangeReceive, filter);

十一、ContentProvider *******************************
1.ContentResolver
Cursor cursor = context.getContentResolver().query(
uri,     // uri
null,   // 需要查询的字段String[]{}
null,   // 查询条件,可设?
null,   // 查询条件的参数,String[]{}
null     // 排序
);











































  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值