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
    评论
Android 基础知识包括以下内容: 1. Android 是什么? Android 是一个开源的操作系统,主要用于移动设备,例如智能手机和平板电脑。它由 Google 公司开发并维护,基于 Linux 内核,并提供了丰富的应用程序框架。 2. Android 应用程序的结构 Android 应用程序由四个主要组件构成:活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供程序(Content Provider)。这些组件可以协同工作来创建丰富的用户体验。 3. Android 应用程序的开发语言 Android 应用程序可以使用 Java、Kotlin 或 C++ 进行开发。Java 是最常用的开发语言,但 Kotlin 正在逐渐流行起来。 4. Android 开发工具 Android 开发工具包(Android SDK)是 Android 开发所需的一套工具和库。其中包括 Android Studio(集成开发环境)、Android 调试桥(ADB)、模拟器和设备驱动程序等。 5. Android 布局和用户界面 Android 使用 XML 文件来定义应用程序的布局和用户界面。开发者可以使用一系列的布局容器和视图控件来创建灵活的界面。 6. Android 数据存储 Android 提供了多种数据存储选项,包括 Shared Preferences(用于存储简单的键值对)、文件存储、SQLite 数据库和网络存储(如使用 Retrofit 进行网络请求)。 7. Android 权限管理 Android 应用程序需要获取用户权限才能访问特定功能或数据。开发者需要在应用程序清单文件中声明所需的权限,并在运行时进行权限请求和处理。 这些是 Android 基础知识的一些要点,希望对你有所帮助!如果你还有其他问题,可以继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值