【问题标题】:How I get the response of a native activity?我如何获得原生活动的响应?
【发布时间】:2016-05-05 21:36:59
【问题描述】:

例如:我的应用调用原生设置活动,通过

Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(myIntent, CODE);

然后当它完成时(例如按下后退按钮)我想知道。我尝试过这种方式,但是当本机活动完成时没有调用onActivityResult()...所以我的应用程序没有收到通知...

我该怎么办?有谁知道吗?

谢谢...

编辑:

谢谢大家。 完整的代码是:

public class MainActivity extends AppCompatActivity {

    public static final int DIALOG_CODE = 0x1;

    private TextView txtGps;
    private TextView txtNet;

    private LocationManager manager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        first();
    }

    private void checkConfigs() {
        boolean gps = manager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        boolean net = manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        setWidgets(gps, net);

        if (gps && net){
            Toast.makeText(this, "Configurações Ok!", Toast.LENGTH_SHORT).show();
        } else {
            DialogConfig.exibDialog(getFragmentManager());
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if ((requestCode == DIALOG_CODE) && (resultCode == RESULT_OK)){
            checkConfigs();
        } else {
            Toast.makeText(this, "As config não foram alteradas!", Toast.LENGTH_SHORT).show();
        }
    }

    public void setWidgets(boolean gsp, boolean net){
        if (gsp){
            txtGps.setText(R.string.gps_hab);
        } else {
            txtGps.setText(R.string.gps_n_hab);
        }

        if (net){
            txtNet.setText(R.string.wifi_hab);
        } else {
            txtNet.setText(R.string.wifi_n_hab);
        }
    }

    private View.OnClickListener onClickCheck() {
        return new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkConfigs();
            }
        };
    }

    @SuppressWarnings("ConstantConditions")
    private void first() {
        txtGps = (TextView) findViewById(R.id.txt_gps);
        txtNet = (TextView) findViewById(R.id.txt_net);

        manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        findViewById(R.id.btn_check).setOnClickListener(onClickCheck());
    }

    public static class DialogConfig extends DialogFragment {

        public static void exibDialog(FragmentManager fm){
            new DialogConfig().show(fm, "dialog");
        }

        @Override
        public android.app.Dialog onCreateDialog(Bundle savedInstanceState) {
            return new AlertDialog.Builder(getActivity())
                    .setTitle("As conf não estão corretas! Alt configs?")
                    .setPositiveButton("Ok", onOk())
                    .setNegativeButton("Cancel", onCancel())
                    .create();
        }

        private DialogInterface.OnClickListener onCancel() {
            return new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dismiss();
                }
            };
        }

        private DialogInterface.OnClickListener onOk() {
            return new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent myIntent = new Intent( Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    startActivityForResult(myIntent, DIALOG_CODE);
                }
            };
        }
    }
}

[已解决]

再次感谢大家,我再次尝试,在dialog中创建了一个回调接口,这样可以通知activity并自行调用其他原生设置activity,并在onActivityResult()中得到响应,但只比较了一个代码(不是通过RESULT_OK),这种方式有效。但是还有另一种使用生命周期的方法(就像建议的那样),对我来说似乎更容易。

【问题讨论】:

  • 您的活动将使用标准生命周期方法调用:onRestart()onStart()onResume()。请注意,这些也会因其他原因被调用(例如,用户按下 HOME 并返回)。
  • 显示你的 onActivityResult 方法
  • 您确定该活动应该返回一些东西给您吗?
  • 也许这个帖子可以帮助你:stackoverflow.com/questions/11919259/…
  • 你处理你的 onBackPress() 方法吗?如果没有,则覆盖该方法并将您的代码放在那里以返回结果

标签: android android-intent


【解决方案1】:

我基本上尝试了你尝试的方法,它对我有用。

startActivityForResult(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS), 1);

对于onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d(PREFIX, "onActivityResult");
}

当我回到应用程序时,onActivityResult 被调用。 不知道你在做什么不同。你能出示你的onActivityResult 代码吗?

【讨论】:

  • 我会试试你的代码,但快速浏览一下,我建议不要从静态类/方法调用startActivity()startActivityForResult()。只是为了测试它,从onResume 执行startActivityForResult() 看看它是否有效
猜你喜欢
  • 2012-07-14
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多