赞
踩
目录
在该模式下,Activity可以有多个实例,每次启动一个Activity,无论栈Task里面是否已经存在该Activity的实例,都将创建一个新实例入栈
例如,Acticity A调用B,然后B调用A,这时栈的情况是ABA
当一个SingleTop实例位于栈顶时,再去启动它时,不需要创建新的实例,只需要调用newInstance()方法,但若不在栈顶,则会被重新创建
例如,A调用B,B调用B自己,情况是AB,若A调用B,B调用A,A再调用B,情况是BABA,同Standard
如果启动的Acticity存在于栈Task中,则该Activity的实例会被移到栈顶(相当于将该Acticity之上的实例全部移出栈)
例如,原来Stack里面有ABCD,调用B,那就变成AB
一个Activity就是一个栈
在AndroidManifest.xml下,添加taskAffinity属性(默认情况下不指定该属性值,则该activity的指定栈为应用的包名)
- <activity android:name=".SecondActivity"
- android:launchMode="singleTask"
- android:taskAffinity="com.example.laughter.task_1"/>
在AndroidManifest文件中指定lanchMode属性值
- Intent intent = new Intent(MainActivity.this, SecondActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(intent);
通过Intent中设置标志位来指定启动模式
- <activity android:name=".SecondActivity"
- android:launchMode="singleTask"
- android:taskAffinity="com.example.laughter.task_1"/>
· FLAG_ACTIVITY_NEW_TASK 指定singleTask模式 · FLAG_ACTIVITY_SINGLE_TOP 指定singleTop模式 · FLAG_ACTIVITY_CLEAR_TOP 同一栈中的所有位于该activity上方的都出栈
Intent内部直接声明要启动的activity所对应的class
- Intent intent = new Intent(MainActivity.this, SecondActivity.class);
- startActivity(intnet);
分为两步走 第一步,在文件里配置activity属性
- <activity android:name="com.example.android.tst.secondActivity"
- android:label = @string/title>
- <intent-filter>
- <action android:name="com.example.android.tst.secondActivity/>
- <category android:name="android.intent.category.DEFAULT"/>
- <intent-filter/>
- </activity>
第二步,在需要跳转的地方
Intent intent = new Intent("com.example.android.tst.secondActivity");
MainActivity:
- Intent intent = new Intent(MainActivity.this,OtherActivity.class);
- intent.putExtra("a",a);
- startActivityForResult(intent,1000);
-
- // 在MainActivity中获取返回值
- @Override
- protected void onActivityResult(int requestCode, int resultCode ,Intent data) {
- super.onActivityResult(requestCode,resultCode,data);
- if(requestCode == 1000){
- if(resultCode == 1001){
- int c = data.getExtra("c",0);
- }
- }
- }
在OtherActivity中设置返回值
- Intent intent = new Intent();
- intnet.putExtra("c",c);
- setResult(1001,int);
- finish();
- <application
- ....>
- ...
- <service
- android:name=".MyService"
- android:enabled="true"
- android:exported="true">
- </service>
- </application>
- Intent startIntent = new Intent(this,MyService.class);
- startService(startIntent);
- Intent stopIntent = new Intent(this,MyService.class);
- stopService(stopIntent);
- public class MyService extends Service{
- Intent intent = new Intent(this, MainActivity.class);
- PendingIntent pi = PendingIntent.getActivity(this, 0 , intent, 0);
- Notification notification = new NotificationCompat.Builder(this)
- .setContentTitle(" this is content titile")
- .setContentText("this is content text")
- .setWhen(System.currentTimeMillis())
- .setSmallIcon(R.mipmap.ic_launcher);
- .setLargeIcon(BitmapFactory.decodeResource(getResource(),R.mipmap.ic_launcher))
- .setContentIntent(pi)
- .build();
- // startForeground()方法是将MyService变成一个前台服务,并在系统状态栏显示出来
- startForeground(1,notification);
- }
- public class MyService extends Service{
- ...
- @Override
- public int onStartCommand(Intent intent , int flags, int startId){
- new Thread(new Runnable(){
- public void run(){
- //处理具体的逻辑
- //如此写的话需要手动调用stopService()或者stopSelf()方法去让服务器停止
- stopSelf();
- }
- }).start();
- return super.onStartCommand(intent, flags, startId);
- }
- }
- public class MyIntentService extends IntentService{
-
- public MyIntentService(){
- // 调用父类的有参构造方法
- super("MyIntentService");
- }
-
- @Override
- protected void onHandleIntent(Intent intent){
- // 打印当前的线程ID
- Log.e("mylog","Thread id is” + Thread.cuttentThread().getId();
- // 写一些需要处理的逻辑
- }
-
- @Override
- public void onDestory(){
- super.onDestory();
- Log.e("mylog","on Destory executed");
- }
- }
- Intent intent = new Intent(this, MyIntentService.class);
- startServcie(intent);
- // 并且,执行完毕会自动关闭

源码地址
DoSomeAndroidTest/ServiceTest at main · qricis/DoSomeAndroidTest · GitHub
- <receiver
- android:enable="true"/"false"
-
- //此broadcastReceiver 是否接受其他应用发出的广播
- //默认值时由receiver中有无intent-filter决定,如果有,默认true,否则默认false
- android:exported="true"/"false"
- android:icon="drawable resource"
- android:label="string resource"
-
- //继承BroadcastReceiver子类的类名
- android:name=".mBroadcastReceiver"
-
- //具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收;
- android:permission="string"
-
- //BroadcastReceiver运行所处的进程
- //默认为app的进程,可以指定独立的进程
- //注:Android四大基本组件都可以通过此属性指定自己的独立进程
- android:process="string" >
-
- //用于指定此广播接收器将接收的广播类型
- //本示例中给出的是用于接收网络状态改变时发出的广播
- <intent-filter>
- <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
- </intent-filter>
- </receiver>

- <receiver
- //此广播接收者类是mBroadcastReceiver
- android:name=".mBroadcastReceiver" >
- //用于接收网络状态改变时发出的广播
- <intent-filter>
- <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
- </intent-filter>
- </receiver>
- //实例化BroadcastReceiver子类 & IntentFilter
- mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
- IntentFilter intentFilter = new IntentFilter();
-
- //设置接收广播的类型
- intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
-
- //动态注册:调用Context的registerReceiver()方法
- registerReceiver(mBroadcastReceiver, intentFilter);
-
- //动态注册广播后,需要在相应位置记得销毁广播
- unregisterReceiver(mBroadcastReceiver);
动态注册最好在onResume()中注册,在onPause()中注销,否则会导致内存泄漏
对于不同注册方式的广播接收器回调onReceive(Context context,Intent intent)中context返回值是不一样的
源码地址
DoSomeAndroidTest/BroadcastTest at main · qricis/DoSomeAndroidTest · GitHub
DoSomeAndroidTest/BroadcastTest2 at main · qricis/DoSomeAndroidTest · GitHub
它主要由两部分组成:authority 和 path authority 是用于对不同的应用程序做区分的,一般为了避免冲突,都会采用程序包名的方式进行命名。 path则是用于对同一应用程序中不同的表做区分,通常都会添加到authority后面: content://com.example.app.provider/table1 content://com.example.app.provider/table2 而使用它作为参数的时候,需要将URL转换为URL对象: Uri uri = Uri.parse("content://com.example.app.provider/table1")
- public class MyProvider extends ContentProvider{
- @Override
- public boolean onCreate() {
- return false;
- }
- @Override
- public Cursor query(Uri uri, String[] projection, Stirng selection, String[] selectionArgs, String sortOrder){
- return null;
- }
- @Overrride
- public Uri insert(Uri uri , ContentValues values){
- return null;
- }
- @Override
- public int update(Uri uri, ContentValuse values, String selection, String[] selectionArgs){
- return 0;
- }
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs){
- return 0;
- }
- @Override
- public String getType(Uri uri){
- return null;
- }
- }

query()方法参数 | 对应SQL部分 | 描述 |
uri from | table_name | 指定查询某个应用程序下的某个表 |
projection | select column1, column2 | 指定查询的列名 |
selection | where column=value | 指定where约束条件 |
selectArgs | - | 为where中的占位符提供具体的值 |
orderBy | order by column1, column2 | 指定查询结果的排序方式 |
- Cursor cursor = getContentResolver().query(
- uri,
- projection,
- selection,
- selectionArgs,
- sortOrder
- );
- if(cursor != null){
- while(cursor.moveToNext()) {
- String column1 = cursor.getString(cursor.getColumnIndex("column1"));
- int column2 = cursor.getInt(cursor.getColumnIndex("column2"));
- }
- cursor.close();
- }
- ContentValues values = new ContentValues();
- values.put(“column1”, "text");
- values.put("column2", 1);
- getContentResolver().insert(uri, values);
- ContentValues valuse = new ContentValues();
- valuse.put("column1", "");
- getContentResolver().update(uri, values, "column1 = ? and column2 = ?", new String[]{"text", 1});
getContentResolver().delete(uri , "column2 = ?", new String[]{ "1"});
- if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
- ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1);
- }else {
- // 读取联系人
- readContacts();
- }
-
- private void readContacts(){
- Cursor cursor = null;
- try{
- // 查询联系人数据
- cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
- if(cursor != null){
- while(cursor.moveToNext()){
- // 获取联系人姓名
- String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
- // 获取联系人电话号码
- String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
- list.add(name+"\n"+number);
- }
- }
- }catch(Exception e){
- e.printStackTrace()
- }finally{
- if(cursor != null){
- cursor.close();
- }
- }
- }
-
- @Override
- public void onRequestPermissionResult(int requestCode, String[] permissions, int[] grantResults){
- switch(requestCode){
- case 1:
- if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
- readContacts();
- }else {
- // 您拒绝了权限
- }
- }
- }

content://com.example.app.provider/table1 content://com.example.app.provider/table1/1 //一个能够匹配任意表的内容URI格式就可以写成: content://com.example.app.provider/* //一个能够匹配表中任意一行数据的内容URI格式就可以写成: content://com.example.app.provider/table1/#
作用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。