Android ';通过&x27共享;在没有视图的情况下运行的应用程序
我想编写一个位于“通过共享”菜单中的应用程序(用于快速通过电子邮件向自己发送指向我在web上找到的内容或在RSS阅读器中查看的内容的链接),为此,我使用intent.action.SEND intent过滤器声明我的应用程序: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" > <
<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>