是否厌烦了写各种onActivityResult?不要急,透明fragment来帮你
虽然fragment坑死人不偿命,但是不写view,只作为辅助功能来使用,还是很好用的.
思路来自于:RxPermissionsFragment 代码库在: github.com/hss01248/St…
基类
public BaseTransFragment(FragmentActivity activity, Bean bean) {
this.activity = activity;
this.bean = bean;
startFragmentTransaction();
}
private void startFragmentTransaction() {
try {
FragmentManager fragmentManager = activity.getSupportFragmentManager();
fragmentManager.beginTransaction()
.add(this, UUID.randomUUID().toString())
.commitNowAllowingStateLoss();
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
if(debugable){
Log.d("frag","onCreate:"+this);
}
}
public void finish(){
try {
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commitAllowingStateLoss();
}catch (Throwable throwable){
throwable.printStackTrace();
}
}
例子:
onactivityResult的处理:
class InAppResultFragment extends BaseTransFragment<Intent> {
public InAppResultFragment(FragmentActivity activity, Intent intent) {
super(activity, intent);
}
TheActivityListener listener;
public void startActivityForResult(TheActivityListener listener){
try {
this.listener = listener;
startActivityForResult(bean,new Random().nextInt(589));
}catch (Throwable e){
listener.onActivityNotFound(e);
if(StartActivityUtil.debugable){
e.printStackTrace();
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (StartActivityUtil.debugable) {
Log.i("onActivityResult", "req:" + requestCode + ",result:" + resultCode + ",data:" + data);
}
listener.onActivityResult(requestCode,resultCode,data);
finish();
}
}
使用:
new InAppResultFragment(activity,intent).startActivityForResult(listener);
此处提供一个启动activity获取result的工具类:
启动app内部页面,可以拿到onActivityCreated和onActivityResult回调 其中,onActivityCreated是通过application上注册生命周期实现
StartActivityUtil.startActivity(this, ActivityDemo2.class, null,true,
new TheActivityListener<ActivityDemo2>() {
@Override
public void onActivityCreated(@NonNull ActivityDemo2 activity, @Nullable Bundle savedInstanceState) {
//这里设置数据,然后在具体activityOnCreate()方法的super.onCreate()之后直接拿数据
activity.setData(666);
Toast.makeText(activity, "activity oncreate 回调", Toast.LENGTH_LONG).show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Toast.makeText(MainActivity.this, "activity onActivityResult 回调", Toast.LENGTH_LONG).show();
}
});
启动第三方app,在回来时接收/检测结果:
StartActivityUtil.goOutAppForResult(this, intent, new OutActivityResultListener() {
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
boolean hasPermission = NotificationManagerCompat.from(MainActivity.this).areNotificationsEnabled();
Toast.makeText(MainActivity.this,"通知栏权限:"+hasPermission,Toast.LENGTH_SHORT).show();
}
@Override
public void onActivityNotFound(Throwable e) {
}
});
例子2. 拍照/图片选择-裁剪-压缩整个流程,封装成一个工具方法:
TakePhotoUtil.startPickOne(this, false, new TakeOnePhotoListener() {
@Override
public void onSuccess(String s) {
showImg(filePath);
}
@Override
public void onFail(String path, String msg) {
MyToast.errorBigL(s1);
}
@Override
public void onCancel() {
}
});