Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ';通过&x27共享;在没有视图的情况下运行的应用程序_Android_Android Intent_Asynchronous_Android Asynctask_Android View - Fatal编程技术网

Android ';通过&x27共享;在没有视图的情况下运行的应用程序

Android ';通过&x27共享;在没有视图的情况下运行的应用程序,android,android-intent,asynchronous,android-asynctask,android-view,Android,Android Intent,Asynchronous,Android Asynctask,Android View,我想编写一个位于“通过共享”菜单中的应用程序(用于快速通过电子邮件向自己发送指向我在web上找到的内容或在RSS阅读器中查看的内容的链接),为此,我使用intent.action.SEND intent过滤器声明我的应用程序: <activity android:name="uk.co.baroquedub.checkit.MainActivity" android:label="@string/app_name" > <

我想编写一个位于“通过共享”菜单中的应用程序(用于快速通过电子邮件向自己发送指向我在web上找到的内容或在RSS阅读器中查看的内容的链接),为此,我使用intent.action.SEND intent过滤器声明我的应用程序:

    <activity
        android:name="uk.co.baroquedub.checkit.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
           </intent-filter>
    </activity>

见:

谁能告诉我如何让我的应用程序启动(从‘共享’菜单’)并执行我的代码,但实际上没有“查看”(如果这是空白屏幕和标题栏的正确术语)?

  • 启动没有任何UI的活动
  • 启动一个服务,在OnCreate中执行后台服务
  • 一旦开始服务,立即完成活动
  • 让服务发布关于完成的通知或祝酒词

  • 如果您确实想显示对话框,您可以仅使用服务中的对话框启动单独的活动,但显示对话框通常会造成干扰。

    感谢Nandeesh让我走上了正确的道路。对于那些想确切知道如何做到这一点的人,以下是完整的解决方案:

    1:在没有任何UI的情况下启动活动 为此,我在AndroidManifest中使用了以下主题:

    android:theme=“@android:style/theme.NoDisplay”

    这使得初始应用程序不仅透明,而且完全没有UI

    2:启动一项服务,在OnCreate中执行后台服务 在这里,我仍然必须从共享意图中“抓取”URL,并将其作为额外内容传递给服务:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        // get url
        Intent intent = getIntent();
        intent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );
        String action = intent.getAction();
    
        // if this is from the share menu
       if (Intent.ACTION_SEND.equals(action)) {   
               title = intent.getStringExtra(Intent.EXTRA_SUBJECT);
               url = intent.getStringExtra(Intent.EXTRA_TEXT);
    
               // Flipboard fix (remove title in URL)
               url = url.replace(title, "");
    
               if (url != null){
                url = title+"\n"+url;
               } else {
                url = "error getting URL";
               }
    
        // prepare service
        Intent emailSendIntent = new Intent(getApplicationContext(), EmailSendService.class);
        emailSendIntent.putExtra("extraData", url);
        startService(emailSendIntent);
    
        finish();
       }
    
    }
    
    3:启动服务后立即完成活动 -见上文

    请注意,在服务中,额外的内容会传递给OnStart方法(而不是预期的On Create方法),请参见:

    4:让服务发布完成通知或祝酒。 我无法让服务打开一个对话框通知(根据我原来的应用程序),这会使应用程序/服务不断崩溃,但Toast工作得很好——正如Nandeesh所说,它可能没有那么麻烦

    这是服务包:

    public class EmailSendService extends Service {
    
    String url;
    String message;
    
    
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
    
    @Override
    public void onCreate() {
        super.onCreate();
    
    }
    
    
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    
    @Override 
    public void onStart(Intent intent, int startId) {
          super.onStart(intent, startId);
          url = intent.getExtras().getString("extraData");
    
          String senderPassword = getResources().getString(R.string.senderPassword); 
          String senderEmail = getResources().getString(R.string.senderEmail); 
          String recipientEmail = getResources().getString(R.string.recipientEmail); 
          String subjectText = getResources().getString(R.string.subjectText);
    
          GMailSender sender = new GMailSender(senderEmail, senderPassword);
            try {
                sender.sendMail(subjectText,   
                        url,   
                          senderEmail,   
                          recipientEmail);
                    message = "Email sent";
                } catch (Exception e) {
                    message = "Error sending email";
                }
            Toast.makeText(this, message, Toast.LENGTH_LONG).show();
        }
    
    }

    注意。请记住在清单中声明服务(在应用程序标记内):


    感谢Nandeesh让我走上了正确的道路。多给我一点指导会有帮助的:)但通过遵循您的步骤并研究如何实施这些步骤,我学到了很多。对于那些想确切知道如何做的人,我添加了一个完整的解决方案作为补充答案。
    public class EmailSendService extends Service {
    
    String url;
    String message;
    
    
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
    
    @Override
    public void onCreate() {
        super.onCreate();
    
    }
    
    
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    
    @Override 
    public void onStart(Intent intent, int startId) {
          super.onStart(intent, startId);
          url = intent.getExtras().getString("extraData");
    
          String senderPassword = getResources().getString(R.string.senderPassword); 
          String senderEmail = getResources().getString(R.string.senderEmail); 
          String recipientEmail = getResources().getString(R.string.recipientEmail); 
          String subjectText = getResources().getString(R.string.subjectText);
    
          GMailSender sender = new GMailSender(senderEmail, senderPassword);
            try {
                sender.sendMail(subjectText,   
                        url,   
                          senderEmail,   
                          recipientEmail);
                    message = "Email sent";
                } catch (Exception e) {
                    message = "Error sending email";
                }
            Toast.makeText(this, message, Toast.LENGTH_LONG).show();
        }
    
        <service
            android:name=".EmailSendService"
            android:label="CheckIt EmailSendService" >
        </service>