Android 阻止意图打开我的应用程序

Android 阻止意图打开我的应用程序,android,android-intent,Android,Android Intent,我正在创建一个Android应用程序,它将接收所有短信,进行一些处理,并将其存储在一个数据库中,以后可以从我的应用程序中查看 我在SMS receiver类中使用Intent。主活动将获取此意图并将其保存到数据库中。我的代码运行良好,做了我需要的一切,但我唯一的问题是,每次我收到短信,我的应用程序就会启动 我的预期行为是,当用户收到短信时,应在后台将详细信息(姓名、消息和日期)添加到数据库中,而无需打开我的应用程序。是否有任何属性可以用于禁止启动我的应用程序,或者我应该删除这些属性并使用其他替代

我正在创建一个Android应用程序,它将接收所有短信,进行一些处理,并将其存储在一个数据库中,以后可以从我的应用程序中查看

我在SMS receiver类中使用Intent。主活动将获取此意图并将其保存到数据库中。我的代码运行良好,做了我需要的一切,但我唯一的问题是,每次我收到短信,我的应用程序就会启动

我的预期行为是,当用户收到短信时,应在后台将详细信息(姓名、消息和日期)添加到数据库中,而无需打开我的应用程序。是否有任何属性可以用于禁止启动我的应用程序,或者我应该删除这些属性并使用其他替代方法

这是我的密码

My SMS Receiver Class

public class SMSReceiver extends BroadcastReceiver 
{

@Override
public void onReceive(Context context, Intent intent)
{

    Bundle bundle = intent.getExtras();
    Object[] pdus = (Object[]) bundle.get("pdus");
    SmsMessage[] messages = new SmsMessage[pdus.length];
    for (int i = 0; i < messages.length; i++)
    {
        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
        String address = messages[i].getOriginatingAddress();
        String message = messages[i].getDisplayMessageBody().toString();
        long time = messages[i].getTimestampMillis();


        String dateFromSms = formatter.format(calendar.getTime());

        Intent newintent = new Intent(context, MainActivity.class);
        newintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        newintent.putExtra("address", address);
        newintent.putExtra("message",
                m.group(1));
        newintent.putExtra("date",
                time.toString());
        context.startActivity(newintent);

    }
}
}


My MainActivity Class

public class MainActivity extends Activity
{
public void onCreate(final Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.content_main);
    TransactionDataBase DB = new TransactionDataBase(this,2);
    Bundle extras = getIntent().getExtras();
    if (extras != null) 
    {
        String address = extras.getString("address");
        String message = extras.getString("message");
        String date = extras.getString("date");

        DB.addMessage(address, message, date);
    }
    }
}
我的短信接收器类
公共类SMSReceiver扩展了BroadcastReceiver
{
@凌驾
公共void onReceive(上下文、意图)
{
Bundle=intent.getExtras();
Object[]pdus=(Object[])bundle.get(“pdus”);
SmsMessage[]messages=新SmsMessage[pdus.length];
for(int i=0;i
我唯一的问题是,每当我收到短信,我的应用程序就会启动

不,您的
MainActivity
会启动,因为您每次收到短信时都会在指向
MainActivity
Intent
上调用
startActivity()

更糟糕的是,在该活动中,您在主应用程序线程上执行数据库I/O

是否有任何属性可用于禁止启动我的应用程序

你应该删除所有的代码

使用其他替代方法


让数据库I/O由
IntentService
执行,而不是由
活动执行

而不是启动活动,只需插入数据库即可

您需要更改您的
onReceive
,如下所示:

@Override
public void onReceive(Context context, Intent intent)
{

    Bundle bundle = intent.getExtras();
    Object[] pdus = (Object[]) bundle.get("pdus");
    SmsMessage[] messages = new SmsMessage[pdus.length];
    for (int i = 0; i < messages.length; i++)
    {
        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
        String address = messages[i].getOriginatingAddress();
        String message = messages[i].getDisplayMessageBody().toString();
        long time = messages[i].getTimestampMillis();

        String dateFromSms = formatter.format(calendar.getTime());

        TransactionDataBase DB = new TransactionDataBase(context,2);
        DB.addMessage(address, message, time.toString());
    }
}
@覆盖
公共void onReceive(上下文、意图)
{
Bundle=intent.getExtras();
Object[]pdus=(Object[])bundle.get(“pdus”);
SmsMessage[]messages=新SmsMessage[pdus.length];
for(int i=0;i
而不是
Intent newintent=new….
以下5行使用插入到数据库中的代码(当前为您的mainactivity中的代码),将其移动到广播接收器。不启动您的活动如何<代码>上下文.startActivity(newintent)好的,那么我可以继续删除我所有的意图代码并在我的SMSReceiver类中进入数据库吗?@God\u Father:这不是一个好主意<在主应用程序线程上调用code>onReceive()
。当您的数据库I/O正在进行时,如果您的UI位于前台,它将被冻结。由
IntentService
执行数据库I/O,从您的
onReceive()
方法开始。谢谢您的Commonware。我现在使用IntentService使其工作。