从IntentHandler传递到需要的方法的上下文是什么?

时间:2018-06-16 19:24:35

标签: android android-context android-intentservice

我刚刚添加了一个新条件的检查,该条件可能会在使用“借用”代码显示消息的长期应用中出现。

该声明位于IntentHandler的{​​{1}}内,DbQuery

extends IntentService

showMessage(getApplicationContext(), "title", "note", mDatabase); // LINE 576 **** 在课程showMessage中定义并一直有效,直到我决定看到它适用于我的Android 4平板电脑(19):

Utilities

它调用发生异常的方法(用*****标记):

  public static void showMessage(Context mContext, String tit, String mm, SQLiteDatabase m)
  {
    TextView message = new TextView(mContext);
    TextView title   = new TextView(mContext);
    title.setText(tit);
    message.setText(mm);
    showCenteredInfoDialog(mContext, title, message, Gravity.CENTER, m); // **** LINE 505
  }

来自 public static void showCenteredInfoDialog ( Context context, TextView message, TextView title, int gravity, SQLiteDatabase m ) { context.getSystemService(Context.LAYOUTINFLATERSERVICE); int YELLOWFOREGROUND ; int BRIGHTBLUEBACKGROUND ; { YELLOWFOREGROUND = context.getResources().getColor(R.color.yellowforeground, null); BRIGHTBLUEBACKGROUND = context.getResources().getColor(R.color.brightbluebackground, null); title.setTextColor(YELLOWFOREGROUND); title.setBackgroundColor(BRIGHTBLUEBACKGROUND); title.setGravity(Gravity.CENTER); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setPositiveButton("OK", null); builder.setCustomTitle(title); builder.setMessage(message.getText()); AlertDialog dialog; dialog = builder.show(); // *************************** LINE 482 dialog.setCanceledOnTouchOutside(false); TextView messageView = /*(TextView)*/ dialog.findViewById(android.R.id.message); messageView.setTextColor(YELLOWFOREGROUND); messageView.setBackgroundColor(BRIGHTBLUEBACKGROUND); messageView.setTypeface(Typeface.MONOSPACE); messageView.setGravity(gravity); } } 的{​​{1}}来电,其中showMessage已通过MainActivity

我想我不应该尝试从Context拨打this,但我想知道我应该怎么称呼它。 即,我应该通过showMessage什么?

对于IntentHandler的第一个参数,我尝试过ContextshowMessagethisgetApplicationContext()getApplication()。全部返回以下错误。我甚至提供了一个监听器而不是getApplication().getApplicationContext()作为builder.setPositiveButton的第二个参数。同样的错误:

getBaseContext()

接下来是部分调试跟踪的打印屏幕。

enter image description here

3 个答案:

答案 0 :(得分:1)

您应该使用活动上下文来解决此错误,我希望解决此错误。

私有上下文上下文

在onCreate方法中初始化此上下文,如此

context = this; //并使用此上下文

  

showMessage(context,“title”,“note”,mDatabase);

并且还在单例类中创建一个上下文类型变量用作全局verialbe

答案 1 :(得分:1)

一般来说,当没有活动时,Android Service可能正在运行。它只是Android中的另一个核心实体,如ActivityBroadcastReceiver

如果您的Android Service不负责更新用户界面,而是向您的Activity发送可用于更新用户界面的足够数据,那就更清晰了。例如,您的Android Service可以使用Broadcast发送消息,Activity可以通过BroadcastReceiver收听这些消息。

BROADCAST_FILTER中定义Service,以便BroadcastReceiver可以识别邮件意图来自服务:

public static String BROADCAST_FILTER = <Your service class>.class.getName();

发送意向表单Service

//send a broadcast intent from your service
Intent intent = new Intent();
intent.setAction(BROADCAST_FILTER);
intent.putExtra("message", "<your message here>")
sendBroadcast(intent);

BroadcastReceiver

中注册Activity
private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String message = intent.getStringExtra();
        Utils.showMessage(<your activity>.this, ...);
        //do your update here
    }
};

@Override
protected void onResume() {
    super.onResume();

    IntentFilter filter = new IntentFilter();
    //make sure your onReceive receives only the messages with this action
    filter.addAction(<Your Service>.BROADCAST_FILTER);
    registerReceiver(receiver, filter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(receiver);
}

答案 2 :(得分:0)

由于我的应用程序的性质,在问我的问题之前,我已经有一个BroadcastManager和一个BroadcastReceiver了,所以我已经尝试了一个微弱的尝试,类似于@ user805311建议。

我基本上是说对了,尽管@nishant的链接显示了如何做到这一点,我只是不应该尝试在showMessageIntentService

我对现有代码所做的更改如下:

在{{1}的publishProgress的{​​{1}}中,我向顶部的IntentService添加了代码,以通过以下方式传递消息(存储在QueryDb中)另一个if而不是progress引起了异常,并立即开始通过Intent关闭该过程:

showMessage

在执行过程中,这样的调用将毫无结果:

onPostExecute

已发布的消息文本在public class QueryDb extends IntentService { ... private void publishProgress(String progress) { Intent intent = new Intent(MatchesActivity.SOME_ACTION); if(progress.toLowerCase().startsWith("Revise")) { intent.putExtra(MatchesActivity.STRING_EXTRA_NAME, progress); onPostExecute(); } else ... ... LocalBroadcastManager.getInstance(this).sendBroadcast(intent); } 内部进行了这样的解释,该文本已启动 String messageText = "Revise code!"; publishProgress(messageText); 并开始侦听消息。

这是MatchesActivity最终工作的第一个地方。

IntentService

但是,为了继续寻求可接受的showMessage public class MatchesActivity extends Activity implements QueryDb.DbProcListenerForQueryDb { private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String s = intent.getStringExtra(STRING_EXTRA_NAME) ; if(s.startsWith("Revise")) { showMessage(_context, "Oh, no...", s, null); MatchesActivity.this.setResult(RESULT_CANCELED); } else ... ... }; // BroadcastReceiver ,我从上面的代码中删除了showMessage,并将其中一个放在{{1}中的Context中},它还可以在showMessage中正常工作,其中收到并处理了有关取消的“坏消息”:

onActivityResult

长话短说,将MainActivityonActivityResult(不会扩展Activity)移到public class MainActivity extends Activity { ... @Override protected void onActivityResult(int requestCode, int resultCode, Intent intentData) { if(resultCode != RESULT_OK) { showMessage(this, "Bad news", "Only Scrabble", mDatabase); return; } ... showMessage中,消除了关于QueryDb的错误。