我刚刚添加了一个新条件的检查,该条件可能会在使用“借用”代码显示消息的长期应用中出现。
该声明位于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
的第一个参数,我尝试过Context
,showMessage
,this
,getApplicationContext()
和getApplication()
。全部返回以下错误。我甚至提供了一个监听器而不是getApplication().getApplicationContext()
作为builder.setPositiveButton的第二个参数。同样的错误:
getBaseContext()
接下来是部分调试跟踪的打印屏幕。
答案 0 :(得分:1)
您应该使用活动上下文来解决此错误,我希望解决此错误。
私有上下文上下文
在onCreate方法中初始化此上下文,如此
context = this; //并使用此上下文
showMessage(context,“title”,“note”,mDatabase);
并且还在单例类中创建一个上下文类型变量用作全局verialbe
答案 1 :(得分:1)
一般来说,当没有活动时,Android Service
可能正在运行。它只是Android中的另一个核心实体,如Activity
或BroadcastReceiver
。
如果您的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的链接显示了如何做到这一点,我只是不应该尝试在showMessage
中IntentService
。
我对现有代码所做的更改如下:
在{{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
长话短说,将MainActivity
从onActivityResult
(不会扩展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
的错误。